返回介绍

5.9 函数注解

发布于 2024-02-05 21:59:47 字数 2152 浏览 0 评论 0 收藏 0

Python 3 提供了一种句法,用于为函数声明中的参数和返回值附加元数据。示例 5-19 是示例 5-15 添加注解后的版本,二者唯一的区别在第一行。

示例 5-19 有注解的 clip 函数

def clip(text:str, max_len:'int > 0'=80) -> str:  ➊
  """在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[:end].rstrip()

➊ 有注解的函数声明。

函数声明中的各个参数可以在 : 之后增加注解表达式。如果参数有默认值,注解放在参数名和 = 号之间。如果想注解返回值,在 ) 和函数声明末尾的 : 之间添加 -> 和一个表达式。那个表达式可以是任何类型。注解中最常用的类型是类(如 str 或 int)和字符串(如 'int > 0')。在示例 5-19 中,max_len 参数的注解用的是字符串。

注解不会做任何处理,只是存储在函数的 __annotations__ 属性(一个字典)中:

>>> from clip_annot import clip
>>> clip.__annotations__
{'text': <class 'str'>, 'max_len': 'int > 0', 'return': <class 'str'>}

'return' 键保存的是返回值注解,即示例 5-19 中函数声明里以 -> 标记的部分。

Python 对注解所做的唯一的事情是,把它们存储在函数的 __annotations__ 属性里。仅此而已,Python 不做检查、不做强制、不做验证,什么操作都不做。换句话说,注解对 Python 解释器没有任何意义。注解只是元数据,可以供 IDE、框架和装饰器等工具使用。写作本书时,标准库中还没有什么会用到这些元数据,唯有 inspect.signature() 函数知道怎么提取注解,如示例 5-20 所示。

示例 5-20 从函数签名中提取注解

>>> from clip_annot import clip
>>> from inspect import signature
>>> sig = signature(clip)
>>> sig.return_annotation
<class '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 属性。示例 5-20 用到了这几个属性。

在未来,Bobo 等框架可以支持注解,并进一步自动处理请求。例如,使用 price:float 注解的参数可以自动把查询字符串转换成函数期待的 float 类型;quantity:'int > 0' 这样的字符串注解可以转换成对参数的验证。

函数注解的最大影响或许不是让 Bobo 等框架自动设置,而是为 IDE 和 lint 程序等工具中的静态类型检查功能提供额外的类型信息。

深入分析函数之后,本章余下的内容介绍标准库中为函数式编程提供支持的常用包。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文