函数注解

函数注解

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)
<class 'str'> : text = <class 'inspect._empty'>
'int>0'       : max_len = 80

signature函数返回一个Signature对象,它有一个return_annotation属性和一个parameters属性,后者是一个字典,把参数名映射到Parameter对象上。每个Parameter对象自己也有annotation属性

函数注解的最大的影响是为IDE和lint程序等工具中静态类型检查功能提供额外的类型信息

posted @ 2022-01-04 21:08  里列昂遗失的记事本  阅读(44)  评论(0编辑  收藏  举报