【发布时间】:2021-11-27 07:40:27
【问题描述】:
示例设置:
from typing import Optional
class A(object):
def __init__(self):
self.a: Optional[int] = None
def check_a(self) -> bool:
return self.a is not None
a = A()
if a.check_a():
print(a.a + 1) # error: Unsupported operand types for + ("None" and "int")
check_a 方法检查a 是什么类型的变量,但mypy 没有看到这一点并写入错误。 TypeGuard 不会有帮助,因为它可以创建一个检查类型的函数,而不是一个检查对象变量类型的函数
是否有可能以某种方式让 mypy 注意到这一点,以便使用该函数检查变量 self.a 的类型,而无需在检查中明确引用它? (使用if a.a_check 而不是if a.a is not None)?
【问题讨论】:
-
你知道错误永远不会发生,因为在运行期间,只有当
a.a不是None时才能执行该段代码。但是,mypy没有考虑运行时值,从编译器的角度来看,a.a可以是int或None。而None + 1应该会产生错误。 -
from typing import castprint(cast(int, a.a) + 1) -
你确实有一个类型检查器不理解的“手动”检查,所以你还需要让类型检查器手动理解你断言的状态,这就是
cast的用途。我认为没有其他方法可以让类型检查器理解a.check_a();但我可能错了…… -
我尝试通过 TypeGuard 来实现,但是这里可以使用
self吗?
标签: python type-hinting mypy python-typing