如何解决从 Optional[T] 获取 Python 类型 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
得到相同类型的错误。
是否需要“如果”?
解决方法
必须明确排除该值与 None 相同的情况,而不仅仅是任何 false'y 值。
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)
)not 等同于对 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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。