gpt4 book ai didi

python-3.x - 从 Optional[T] 获取 Python 类型 T 的变量

转载 作者:行者123 更新时间:2023-12-05 03:44:51 31 4
gpt4 key购买 nike

两个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) 之类的隐式拒绝等同于针对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-3.x - 从 Optional[T] 获取 Python 类型 T 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66201099/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com