函数注解
函数注解
Python 3提供了一种句法,用于为函数声明中的参数和返回值附加元数据
# 有注解的clip函数
def clip(text: str, max_len: 'int>0' = 80) -> str: # max_len参数的注解是字符串
'''在max_len前面或后面的第一个空格处截断文本'''
end = None
if len(text) > max_len:
space_before = text.rfind(' ', 0, max_len)
if space_before >= 0:
end = space_before
else:
space_after = text.rfind(' ', max_len)
if space_after >= 0:
end = space_after
if end is None:
end = len(text)
return text[:text].rstrip()
函数声明中的各个参数可以在:之后添加注解表达式。如果参数有默认值,注解放在参数名和=号之间。如果注解返回值,在)和函数生命末尾的:之间添加一个->和一个表达式。这个表达式可以是任何类型。注解中最常用的类型是类(如str和int)和字符串(如'int>0')
注解不会做任何处理,只是存储在__annotations__属性(一个字典)中:
clip.__annotations__
{'text': str, 'max_len': 'int>0', 'return': str}
'return'键保存的的是返回值的注解,即函数声明里以->标记的部分
Python对注解所做的唯一的事情是,把它们存储在函数的__annotations__属性里。仅此而已,Python不做检查、不做强制、不做验证,什么操作都不做。换句话说,注解对Python解释器没有任何意义。注解只是元数据,可以提供IDE、框架和装饰器等工具使用
# 从函数签名中提取注解
from inspect import signature
sig = signature(clip)
sig.return_annotation
str
for param in sig.parameters.values():
note = repr(param.annotation).ljust(13)
print(note, ':', param.name, '=', param.default)
: text =
'int>0' : max_len = 80
signature函数返回一个Signature对象,它有一个return_annotation属性和一个parameters属性,后者是一个字典,把参数名映射到Parameter对象上。每个Parameter对象自己也有annotation属性
函数注解的最大的影响是为IDE和lint程序等工具中静态类型检查功能提供额外的类型信息