gpt4 book ai didi

python - mypy lambda 可选检查

转载 作者:行者123 更新时间:2023-12-04 08:40:09 27 4
gpt4 key购买 nike

我注意到 mypy 在进入 lambda 范围时会忘记类型信息。下面是一个小例子来解释:

from typing import Optional, Callable

def wrapper(x: Callable[[], None]):
x()

def foo(a: int):
print(str(a))

a: Optional[int] = 0

if a is None:
exit()

wrapper(lambda: foo(a))
Mypy 提示此代码段错误: Argument 1 to "foo" has incompatible type "None"; expected "int" .
但是,我们已经检查过 a 不是 None前。这很奇怪,因为如果我们调用 foo(a)直接(没有包装器),它确实有效。
我正在使用 python 3.6.10 和 mypy 0.740。
这是预期的行为吗?如果是这样,您将如何正确输入?
谢谢!

最佳答案

这不是由于 lambda , 但由于 a作为一个闭包。简而言之,即使特定代码无法触发错误路径,该功能在技术上也是错误的。
与修复函数中的闭包的类似问题一样,强制在定义时评估名称提供了有效的类型:

wrapper(lambda a=a: foo(a))
请注意 mypy cannot properly infer lambda types , 所以使用 lambda像这样仍然会导致错误 Cannot infer type of lambda .

考虑完全等价的命名函数:
def l() -> None:
# reveal_type(a) -> Union[builtins.int, None]
return foo(a)
注意 a: Optional[int]在这里可见,而不是减少的 a: inta is None 之后 guard 。所以问题不是来自 lambda而不是 def .
问题的根源在于 llambda关闭 a 的所有值.即使 a: None在定义 l 之前已被拒绝/ lambda ,重置 a有效稍后的。
a: Optional[int]

if a is None: exit()

def l() -> None:
# reveal_type(a) -> Union[builtins.int, None]
return foo(a)

a = None

关于python - mypy lambda 可选检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64610100/

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