函数注解 是可选的用户自定义函数类型的元数据完整信息
标注 以字典的形式存放在函数的 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:
...
|
参考