函数注解 是可选的用户自定义函数类型的元数据完整信息

标注 以字典的形式存放在函数的 annotations 属性中而对函数的其他部分没有影响。 形参标注的定义方式是在形参名后加冒号,后面跟一个会被求值为标注的值的表达式。 返回值标注的定义方式是加组合符号 ->,后面跟一个表达式,这样的校注位于形参列表和表示 def 语句结束的冒号。 下面的示例有一个必须的参数、一个可选的关键字参数以及返回值都带有相应的标注:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def f(ham: str, eggs: str = 'eggs') -> str:
    print("Annotations:", f.__annotations__)
    print("Arguments:", ham, eggs)
    return ham + ' and ' + eggs

f('spam')
# output:
# Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
# Arguments: spam eggs
# 'spam and eggs'

当类型注解太长时,可以使用别名(alias)代表类型

1
2
3
4
5
6
7
8
9
from typing import TypeAlias

_LossAndGradient: TypeAlias = tuple[tf.Tensor, tf.Tensor]
ComplexTFMap: TypeAlias = Mapping[str, _LossAndGradient]

def my_function(
    long_variable_name: _LossAndGradient,
) -> ComplexTFMap:
    ...

在类型注解中, None 是 NoneType 的别名.

如果一个变量有多种可能类型时,可以使用 | 这样的并集 (union) 类型表达式 (推荐在新的 Python 3.10+ 代码中使用) 或者老的 Optional 和 Union 语法.

1
2
3
4
5
6
7
# 现代的并集写法.
def modern_or_union(a: str | int | None, b: str | None = None) -> str:
    ...
# 采用 Union / Optional.
def union_optional(a: Union[str, int, None], b: Optional[str] = None) -> str:
    ...

参考