为什么在python 3.5 +中使用类型

时间:2017-02-25 18:57:56

标签: python types python-3.5 python-3.6

我试图理解为什么我应该在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

我的结果没有任何类型错误的注释。那么使用类型注释的原因是什么?

2 个答案:

答案 0 :(得分:3)

其他工具的类型提示用于检查代码,它们不会在运行时强制执行。目标是启用静态分析工具来检测无效的参数使用。

使用类似PyCharm的IDE,或commandline code checker mypy使用2.0不是有效的参数类型。

来自Type Hinting PEP (484)

  

此PEP旨在为类型注释提供标准语法,打开Python代码以更轻松地进行静态分析和重构,潜在的运行时类型检查,以及(可能在某些情况下)利用类型生成代码信息。

强调我的。运行时类型检查留给第三方工具。请注意,此类运行时检查会带来性能下降,如果要在每次调用时检查类型,则代码可能会运行得更慢。

答案 1 :(得分:1)

正如人们可以阅读PEP 484 that introduces type hints

  

(...)

     

此PEP旨在为类型注释提供标准语法,   打开Python代码到更容易的静态分析和重构,   潜在的运行时类型检查,以及(可能在某些情况下)代码   生成利用类型信息

     

在这些目标中,静态分析是最重要的。这包括   支持离线型跳棋,如mypy ,以及提供   标准符号, IDE可用于代码完成和   重构。

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(并且不会引发例如一个例外)。