从 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))