首页 最新 热门 推荐

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

Python3 函数注释: 参数 中 的 冒号 与 箭头

  • 25-03-03 22:21
  • 3005
  • 5211
blog.csdn.net

 

From:http://iyenn.com/rec/1702892.html

 

 

简述

 

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

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

 

 

为何要引入函数注释?

 

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

自定义 decorator
自定义 docstring 格式
向函数对象添加自定义属性
显然,由于机制和语法的广泛差异,这会在一定程度上引起混乱。

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

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

 

 

函数注释语法

 

函数注释作用是提高代码可读性,暗示传入参数及返回数据的类型。

函数注释包括:

  • 参数注释:以冒号(:)标记,建议传入的参数类型
  • 返回值注释:以 -> 标记,建议函数返回的类型

语法结构大体如下:

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

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

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

 

示例 1:

  1. def greeting(name: str) -> str:
  2. return 'Hello ' + name
  3. print(greeting("mc"))

输出:hellomc

 

但并非强制

示例 2:

  1. def greeting(name: str) -> str:
  2. return name
  3. print(greeting(1.1))

输出:1.1

 

 

单个注释

 

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

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

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

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

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

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

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

 

 

访问函数注释

 

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

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

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

  1. >>> type(sum.__annotations__)
  2. <class 'dict'>
  3. >>>
  4. >>> sum.__annotations__
  5. {'c': 'The default value is 5', 'return': <class 'float'>, 'b': <class 'int'>}

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

 

 

多个注释

 

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

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

调用 div():

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

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

 

 

动态注释

 

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

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

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

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

 

 

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树基础语法函数416686 人正在系统学习中
注:本文转载自blog.csdn.net的擒贼先擒王的文章"https://blog.csdn.net/freeking101/article/details/96480031"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

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

分类栏目

后端 (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