从 Optional[T] 获取 Python 类型 T 的变量
Getting a variable of Python type T from an Optional[T]
两个python方法定义为:
def function() -> Optional[ast.Module]:
pass
def something(t: ast.Module) -> None:
pass
来电者:
var = function()
if var:
do_something(var)
类型检查器抱怨说我无法将 Optional[t] 传递给 t。我想象有某种铸造机制,但它逃脱了我。
准确地说,这是一个单元测试,看起来像:
self.assertIsNotNone(var)
do_something(var)
关于可能重复的 Optional type annotation. Using value after checking if is None?,
new_var: ast.Module = var
出现相同类型的错误。
是否需要'if'?
必须明确排除值与 None 相同的情况,而不仅仅是任何错误的值。
var: Optional[...] = function()
if var is not None: # reject None case in this branch
do_something(var) # `var` is the unwrapped type
反过来也可以:
var: Optional[...] = function()
if var is None: # handle None case in this branch
...
else: # no more None case in this branch
do_something(var) # `var` is the unwrapped type
请注意,类型检查器无法检查任意函数的类型保护。诸如 self.assertIsNotNone(var)
之类的隐式拒绝 不 等同于针对 None
的显式检查。需要额外的明确排除。
self.assertIsNotNone(var)
assert var is not None # reject None case after this point
do_something(var)
当然,总是可以cast
离开这个选项。由于这会禁用对变量类型的验证,因此通常只能作为最后的手段。
do_something(cast(ast.Module, var))
两个python方法定义为:
def function() -> Optional[ast.Module]:
pass
def something(t: ast.Module) -> None:
pass
来电者:
var = function()
if var:
do_something(var)
类型检查器抱怨说我无法将 Optional[t] 传递给 t。我想象有某种铸造机制,但它逃脱了我。
准确地说,这是一个单元测试,看起来像:
self.assertIsNotNone(var)
do_something(var)
关于可能重复的 Optional type annotation. Using value after checking if is None?,
new_var: ast.Module = var
出现相同类型的错误。
是否需要'if'?
必须明确排除值与 None 相同的情况,而不仅仅是任何错误的值。
var: Optional[...] = function()
if var is not None: # reject None case in this branch
do_something(var) # `var` is the unwrapped type
反过来也可以:
var: Optional[...] = function()
if var is None: # handle None case in this branch
...
else: # no more None case in this branch
do_something(var) # `var` is the unwrapped type
请注意,类型检查器无法检查任意函数的类型保护。诸如 self.assertIsNotNone(var)
之类的隐式拒绝 不 等同于针对 None
的显式检查。需要额外的明确排除。
self.assertIsNotNone(var)
assert var is not None # reject None case after this point
do_something(var)
当然,总是可以cast
离开这个选项。由于这会禁用对变量类型的验证,因此通常只能作为最后的手段。
do_something(cast(ast.Module, var))