From:https://blog.csdn.net/liang19890820/article/details/74264380

简述

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

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

为何要引入函数注释?

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

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

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

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

函数注释语法

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

函数注释包括:

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

语法结构大体如下:

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

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

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

示例 1:

def greeting(name: str) -> str:return 'Hello ' + nameprint(greeting("mc"))

输出:hellomc

但并非强制

示例 2:

def greeting(name: str) -> str:return nameprint(greeting(1.1))

输出:1.1

单个注释

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

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

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

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

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

>>> sum(1, 2)
8
>>>
>>> sum('Hello', ', ', 'Python!')
'Hello, Python!'

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

访问函数注释

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

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

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

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

之所以选择 “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
...
>>> 

调用 div():

>>> div.__annotations__
{'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)'}}
>>>
>>> div(5, 2)
2.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

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

Python3 函数注释: 参数 中 的 冒号 与 箭头相关推荐

  1. Python函数参数中的冒号与箭头

    在一些Python的工程项目中,我们会看到函数参数中会有冒号,有的函数后面会跟着一个箭头,你可能会疑惑,这些都是什么东西? 其实函数参数中的冒号是参数的类型建议符,告诉程序员希望传入的实参的类型.函数 ...

  2. python函数注释,参数后面加冒号:,函数后面的箭头→是什么?

    python的函数注释: def f(text:str,max_len:'int>0'=80) ->str:"""这个是函数的帮助说明文档,help时会显示& ...

  3. python函数参数冒号_Python3 - 参数中的冒号和箭头

    Python3.5 中新增了一个功能是类型提示(type hints) -冒号后面是建议传入的参数类型 箭头后面是建议函数返回的类型 如:def greeting(name: str) -> s ...

  4. 8 pycharm 快捷键_Pycharm自动添加文件头注释和函数注释参数

    Pycharm应该是学python必用的编辑器了,关于它的使用之前已经写过几篇文章,今天再给大家继续介绍两个pycharm的小技巧,希望对大家有用. 1.自动添加文件头注释 文件头模板设置路径 Set ...

  5. Pycharm自动添加文件头注释和函数注释参数

    Pycharm应该是学python必用的编辑器了,关于它的使用之前已经写过几篇文章,今天再给大家继续介绍两个pycharm的小技巧,希望对大家有用. 1.自动添加文件头注释 文件头模板设置路径 Set ...

  6. python函数定义时参数后面的冒号与箭头

    在刷leetcode的时候发现题目第一个函数定义行里就有参数后的冒号与箭头: class Solution:def search(self, nums: List[int], target: int) ...

  7. python3函数的参数:必选参数(位置参数)、默认参数、可变参数、关键字参数、命名关键字参数

    了解python函数的参数,是阅读各种库和源码的必需技能,请认真学习并掌握. 1.位置参数: def fn1(a):pass def fn2(a,b):pass msg: pass是占位符,当没有具体 ...

  8. python函数注释 参数 省略号_python – make函数在help()函数中有参数的省略号

    你有(至少)两种选择来实现你想要的. 最好的替代方法是覆盖inspect.Signature类的__str__方法.但是,由于它是用C语言编写的,因此它是只读的. 所以要做到这一点,你需要扩展类如下: ...

  9. python函数注释 参数 省略号_解决python 输出是省略号的问题

    这个问题非常非常重要,搞了一晚上都没解决好,但是真的很简单很简单, 如果你也 是用的numpy array, 如果你也想得到输出矩阵的全部内容,而不是省略形式, [[ 0.10284943 0.095 ...

最新文章

  1. matlab节约里程法_芳烃产业链里程碑:唐山旭阳30万吨/年苯乙烯项目一次性开车成功...
  2. microsoft .net framework专题汇总
  3. Deep Learning 中文翻译
  4. timestamp 转换 mysql_技术分享 | MySQL:timestamp 时区转换导致 CPU %sys 高的问题
  5. 【NLP】授人以渔:分享我的文本分类经验总结
  6. 微信公众号消息模板开发
  7. dto与dto相互转换_在DTO上
  8. java提取json数组对象所有的id,一文轻松搞定
  9. Python爬虫之puppeteer搭建远程服务器
  10. 你以为写小说就只有一种签约方式?
  11. rs232接口_RS232串口通信:接口定义、标准接法详细说明,一看就懂了
  12. mysql日期查询索引_mysql – 如何为这种查询索引两个日期列
  13. Blender - Proportional Edit Mode - 按比例编辑模式(3D版的液化、挤压工具)
  14. “做我女朋友好吗?”vbs源码
  15. (补基础)数据分析系列:假设检验的基础知识
  16. pads layout查看管脚连接
  17. oracle数据库在mybatis中的数值类型(NUMBER型)
  18. 计算机打开音乐,怎么让电脑自动开机播放音乐教程 以及自动关机计划任务设置...
  19. 7月30日科技资讯|网易游戏回应裁员 10%;字节跳动秘密研发手机;iOS 13 beta 5 发布
  20. 有限与无限的游戏:Crypto

热门文章

  1. 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景
  2. 大公司稳定工作和创业之间如何选择?
  3. 海马体what where记忆推理模型
  4. Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态
  5. DGL实现同构/异构图卷积模型
  6. git编译安装与常见问题解决
  7. 前端开发推荐-创建一个精美的jquery图片库效果
  8. VMware虚拟机软件
  9. HBase错误解决(启动Hbase出现错误的替换,启动hbase shell出现ERROR KeeperErrorCode=NoNode for /hbase/master)
  10. 计算机组成原理——计算机系统的性能指标(机器字长、存储容量、运算速度)