首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python 函数注释

  • 25-03-04 00:53
  • 3578
  • 11915
blog.csdn.net

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

在 Python 3.x 中,增加了一个新特性 - 函数注释(Function Annotations),顾名思义,可做为函数额外的注释来用。

函数注释是一个可选功能,它允许在函数参数和返回值中添加任意的元数据。无论是 Python 本身还是标准库,都使用了函数注释,第三方项目可以很方便的使用函数注释来进行文档编写、类型检查、或者是其他用途。

为何要引入函数注释?

在 Python 2.x 中,由于缺少对函数参数和返回值进行注释的标准方法,所以很多工具和库为了填补这一空白,使用了不同的方式:

  • 自定义 decorator
  • 自定义 docstring 格式
  • 向函数对象添加自定义属性

显然,由于机制和语法的广泛差异,这会在一定程度上引起混乱。

为了解决这个问题,Python 3.x 引入了函数注释(详见:PEP-3107),旨在提供了一种单一的、标准的方法,来将元数据与函数参数和返回值相关联。

注意: 注释是完全可选的。

函数注释语法

函数注释包括:

  • 参数注释:以冒号(:)标记
  • 返回值注释:以 -> 标记

语法结构大体如下:

def foo(a: expression, b: expression = 5) -> expression:
    ...
  • 1
  • 2

在伪语法中,参数看起来像:identifier [: expression] [= expression]。也就是说,参数注释总在其默认值之前。当函数定义被执行时,所有的注释表达式都被求值,就像默认值一样。

参数列表后面可以跟一个 -> 和一个 Python 表达式。与参数的注释一样,在执行函数定义时,将对该表达式求值。

单个注释

函数注释可以包含类型、帮助字符串,以及其他更多信息。

来看一个例子,有一个函数 sum(),接受三个参数 a、b、c,并返回它们的和。

>>> def sum(a, b: int, c: 'The default value is 5' = 5) -> float:
...     return a + b + c
... 
>>> 
  • 1
  • 2
  • 3
  • 4

其中,第一个参数 a 没有注释,第二个参数 b 带有类型为 int 的注释,第三个参数 c 带有一个帮助字符串注释并且拥有默认值,返回值用类型 float 来注释。

调用 sum() 两次,一次使用 int,一次使用字符串:

>>> sum(1, 2)
8
>>> 
>>> sum('Hello', ', ', 'Python!')
'Hello, Python!'
  • 1
  • 2
  • 3
  • 4
  • 5

显然,注释对函数的执行没有任何影响。在这两种情况下,sum() 都做了正确的事情,只不过注释被忽略了而已。

访问函数注释

函数对象有一个名为 __annotations__ 的属性,它是一个映射(dict),用于将每个参数名(key)映射到其相关的注释(value)。

注意: 映射中有一个特殊的 key,叫做“return”,仅当为函数的返回值提供注释时,才会显示该 key。

回到上述示例,并检查它的注释:

>>> type(sum.__annotations__)

>>>
>>> sum.__annotations__
{'c': 'The default value is 5', 'return': , 'b': }
  • 1
  • 2
  • 3
  • 4
  • 5

之所以选择 “return”,是因为它不会与任何参数名冲突。“return”是 Python 中的一个关键字,任何使用“return”作为参数名的尝试都会引发 SyntaxError。

多个注释

倘若,函数注释中要同时包含类型和帮助字符串,怎么办?很容易,可以使用具有两个 key(例如:type 和 help)的 dict:

>>> def div(a: dict(type=float, help='the dividend'),
...         b: dict(type=float, help='the divisor (must be different than 0)')
...     ) -> dict(type=float, help='the result of dividing a by b'):
...     """Divide a by b"""
...     return a / b
... 
>>> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

调用 div():

>>> div.__annotations__
{'a': {'type': , 'help': 'the dividend'}, 'return': {'type': , 'help': 'the result of dividing a by b'}, 'b': {'type': , 'help': 'the divisor (must be different than 0)'}}
>>>
>>> div(5, 2)
2.5
  • 1
  • 2
  • 3
  • 4
  • 5

注意: 如果要包含更多的注释(示例中是 2 个),可以在 dict 中包含更多的 key:value 对。

动态注释

__annotations__ 是函数的一个属性,类型为 dict。由于 dict 是可变的,这意味着,可以在程序运行时动态地修改注释。

假设,想知道是否使用了参数的默认值,或者想把所有的返回值都加起来。

>>> def sum(a, b) -> 0:
...     result = a + b
...     sum.__annotations__['return'] += result
...     return result
... 
>>> sum.__annotations__['return']
0
>>> 
>>> sum(1, 2)
3
>>> sum.__annotations__['return']
3
>>> 
>>> sum(3, 4)
7
>>> sum.__annotations__['return']
10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

PS: 动态注释可以在函数内部完成,也可以由装饰器完成。

文章已被收录至官方知识档案
Python入门技能树高级教程函数416716 人正在系统学习中
高效程序员
微信公众号
10W+人都在的技术圈
注:本文转载自blog.csdn.net的一去丶二三里的文章"https://blog.csdn.net/liang19890820/article/details/74264380"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top