我试图理解为什么我应该在python中使用类型注释。例如,我可以编写如下函数:
def some_function(a: int, b: int) -> int:
return a + b
当我使用int时,一切都很顺利:
some_function(1, 2) # return 3, type int
但是当我竞选示例时
some_function(1, 2.0) # return 3.0, type float
我的结果没有任何类型错误的注释。那么使用类型注释的原因是什么?
答案 0 :(得分:3)
其他工具的类型提示用于检查代码,它们不会在运行时强制执行。目标是启用静态分析工具来检测无效的参数使用。
使用类似PyCharm的IDE,或commandline code checker mypy
使用2.0
不是有效的参数类型。
此PEP旨在为类型注释提供标准语法,打开Python代码以更轻松地进行静态分析和重构,潜在的运行时类型检查,以及(可能在某些情况下)利用类型生成代码信息。
强调我的。运行时类型检查留给第三方工具。请注意,此类运行时检查会带来性能下降,如果要在每次调用时检查类型,则代码可能会运行得更慢。
答案 1 :(得分:1)
正如人们可以阅读PEP 484 that introduces type hints:
(...)
此PEP旨在为类型注释提供标准语法, 打开Python代码到更容易的静态分析和重构, 潜在的运行时类型检查,以及(可能在某些情况下)代码 生成利用类型信息。
在这些目标中,静态分析是最重要的。这包括 支持离线型跳棋,如mypy ,以及提供 标准符号, IDE可用于代码完成和 重构。
因此主要用于静态分析:您的IDE可以在调用函数时检测到某些内容出错,并且可以提供可以调用函数结果的函数列表。
例如,如果你写:
some_function(1,2).
您的IDE可以提供一个包含real
的列表作为可能的选项,以便您可以轻松地编写:
some_function(1,2).real
如果你写:
some_function('foo',2).bar
它会暗示'foo'
不是可接受的参数,也不是.bar
对该对象的良好调用。
您还可以使用inspect.getfulargspec
将其用于动态检查,例如:
>>> import inspect
>>> inspect.getfullargspec(some_function).annotations
{'return': <class 'int'>, 'a': <class 'int'>, 'b': <class 'int'>}
现在我们知道some_function
会返回一个int
,并且可以在两个int
中被提供。这可以用于任意测试(在Haskell中很流行):你只需提供some_function
个随机整数,看起来它总是返回int
(并且不会引发例如一个例外)。