问题是类型注释是可选的。事实上
re
模块没有类型注释,甚至在Python3.8中似乎也没有。当然,分析器可以内省Python代码以查看发生了什么。但是,对于某些代码(如
模块),代码最终进入C-API(在CPYthon中)。此时,分析器无法确定函数的类型签名是什么。作为人类,我们可以阅读文档并知道这一点
re.sub
始终返回的实例
str
,但除非向自动化工具提供了补充类型信息,否则它们无法知道。
**
接线员(
int.__pow__
)返回一个
int
A.
float
,或
complex
取决于类型
它的操作数。如。
>>> 3 ** 2
9
>>> 3 ** -2
0.1111111111111111
>>> 2 ** 0.5
1.4142135623730951
>>> (-1) ** 0.5
(6.123233995736766e-17+1j) # should really just be 1j
这意味着,鉴于:
def f(x: int, y: int):
z = x ** y
z
object
(二)共同基础
int
浮动
),这可能不是所希望的。通过给变量一个类型注释,我们可以使mypy在分配给变量时进行类型检查
Z
x ** y
,但任何未来的行动
Z
可以安全地假定
Z
无论它被定义为什么。