向函数添加类型

让我们举一个函数的例子,它接收两个参数并返回一个表示其总和的值:

def two_sum(a, b):
    return a + b

通过查看此代码,人们无法安全且毫无疑问地指出函数 two_sum 的参数类型。它在提供 int 值时都有效:

print(two_sum(2, 1))  # result: 3

和字符串:

print(two_sum("a", "b"))  # result: "ab"

和其他值,如 lists,tuples 等。

由于 python 类型的这种动态特性,其中许多类型适用于给定的操作,任何类型检查器都无法合理地断言是否应该允许对此函数的调用。

为了帮助我们的类型检查器,我们现在可以在函数定义中为它提供类型提示,指示我们允许的类型。

为了表明我们只想允许 int 类型,我们可以将我们的函数定义更改为:

def two_sum(a: int, b: int):
    return a + b

注释遵循参数名称,并由:字符分隔。

同样,为了表明只允许 str 类型,我们将更改我们的函数来指定它:

def two_sum(a: str, b: str): 
    return a + b

除了指定参数的类型之外,还可以指示函数调用的返回值。这是通过在参数列表中在函数声明结尾的:之前添加 -> 字符后跟类型后面的类型来完成的 :

def two_sum(a: int, b: int) -> int: 
    return a + b

现在我们已经指出调用 two_sum 时的返回值应该是 int 类型。同样,我们可以为 strfloatlistset 等定义适当的值。

虽然类型提示主要由类型检查器和 IDE 使用,但有时你可能需要检索它们。这可以使用 __annotations__ 特殊属性来完成:

two_sum.__annotations__
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}