有时我们查看某个模块的源码时,会看到一些函数出现如下情况:
def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
...
我很不理解这参数后边的冒号,以及后边的箭头都是什么意思,查看了PEP 3107 – Function Annotations才知道这是函数注释。
总结下几个特点:
- 函数中的变量注释,就用冒号加上注释内容即可,如foo(x : int)
- 如果函数的参数是默认参数,其写法如下
def foo(a: int = 10, b: str = "some str") -> str:
...
- 箭头后边,表示返回值的类型或者对返回值的说明
- 这些注释仅仅是一个说明,对真正的使用没有影响,比如注释是int,输入的却是str,其一样是可以运行的。
- 要注意:匿名函数lambda是不支持这种函数注释的。
附上几个文档的例子:
Parameters
def foo(a: expression, b: expression = 5):
...
def foo(*args: expression, **kwargs: expression):
...
def foo((x1, y1: expression), (x2: expression, y2: expression)=(None, None)):
...
Return Values
def sum() -> expression:
...
可以通过foo.__annotations__查看注释内容
>>> def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
... pass
...
>>> foo.__annotations__
{'a': 'x', 'b': 11, 'c': <class 'list'>, 'return': 9}