在Python 3.0中(但不包括Python 2.6),也可以给函数对象附加注解信息——与函数的参数和结果相关的任意的用户定义的数据。Python为声明注解提供了特殊的语法,但是,它自身不做任何事情;注解完全是可选的,并且,出现的时候只是直接附加到函数对象的__annotations__属性以供其他用户使用。

从语法上讲,函数注解编写在def头部行,就像与参数和返回值相关的任意表达式一样。对于参数,它们出现在紧随参数名之后的冒号之后;对于返回值,它们编写于紧跟在参数列表之后的一个->之后。例如,这段代码,注解了前面函数的3个参数及其返回值:


def func(a:"spam", b:(1,10), c:float) -> int:
    return a + b + c
func(1,2,3)
Out[29]: 6
func.__annotations__
Out[30]: {
   'a': 'spam', 'b': (1, 10), 'c': float, 'return': int}

由于注解只是附加到一个Python对象的Python对象,注解可以直接处理。下面的例子只是注解了3个参数中的两个,并且通用地遍历附加的注解:

def func(a:"spam", b, c:99):
    return a+b+c
func(1,2,3)
Out[32]: 6
func.__annotations__
Out[33]: {
   'a': 'spam', 'c': 99}
for arg in func.__annotations__:
    print(arg, "=>", func.__annotations__[arg])
    
a => spam
c => 99

这里有两点值得注意。首先,如果编写了注解的话,仍然可以对参数使用默认值——注解(及其:字符)出现在默认值(及其=字符)之前。例如,下面的a: ‘spam’ = 4意味着参数a的默认值是4,并且用字符串’spam’注解它:

def func(a:"spam" = 4, b:(1,10)=5, c:float = 6) -> int:
    return a + b + c
func(1,2,3)
Out[36]: 6
func()
Out[38]: 15
func(c=20)
Out[39]: 29
func.__annotations__
Out[40]: {
   'a': 'spam', 'b': (1, 10), 'c': float, 'return': int}