下面是对 Python 官方文档中的示例稍作修改后的程序,可以很好的展示如何定义并获取函数注解:
def f(ham:str,egg:str='eggs')->str: pass print(f.__annotations__)
输出结果为:
{'ham': <class 'str'>, 'egg': <class 'str'>, 'return': <class 'str'>}
如上所示,给函数中的参数做注解的方法是在形参后添加冒号“:”,后接需添加的注解(可以是类(如 str、int 等),也可以是字符串或者表示式);给返回值做注解的方法是将注解添加到 def 语句结尾的冒号和 -> 之间。
注意,如果参数有默认值,参数注解位于冒号和等号之间。比如 eggs:str='eggs',它表示 eggs 参数的默认值为 'eggs',添加的注解为 str。
给函数定义好注解之后,可以通过函数对象的 __annotations__ 属性获取,它是一个字典,在应用运行期间可以获取。这里再举一个例子:
def square(number:"一个数字")->"返回number的平方": return number**2 print(square(10)) print(square.__annotations__)
运行结果为:
100
{'number': '一个数字', 'return': '返回number的平方'}
事实上,函数注解并不局限于类型提示,而且在 Python 及其标准库中也没有单个功能可以利用这种注解,这也是这个功能独特的原因。
注意,函数注解没有任何语法上的意义,只是为函数参数和返回值做注解,并在运行获取这些注解,仅此而已。换句话说,为函数做的注解,Python不做检查,不做强制,不做验证,什么操作都不做,函数注解对Python解释器没任何意义。
函数注解可能的用法
PEP 3107 作为提议函数注解的官方文档,其中列出了以下可能的使用场景:
- 提供类型信息:包括类型检查、让 IDE 显示函数接受和返回的类型、适配、与其他语言的桥梁、数据库查询映射、RPC参数编组等;
- 其他信息:函数参数和返回值的文档。
总之,虽然函数注解存在的时间和 Python 3 一样长,但目前仍未找到任一常见且积极维护的包,将函数注解用作类型检查之外的功能。Python 3 最初发布时包含函数注解的最初目的也仅是用于试验和玩耍。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/21318.html