Python 函数注释

简述

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

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

  • 简述
  • 为何要引入函数注释
  • 函数注释语法
  • 单个注释
  • 访问函数注释
  • 多个注释
  • 动态注释

版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820

为何要引入函数注释?

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

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

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

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

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

函数注释语法

函数注释包括:

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

语法结构大体如下:

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

在伪语法中,参数看起来像: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
...
>>> 

其中,第一个参数 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: 动态注释可以在函数内部完成,也可以由装饰器完成。

时间: 2024-10-04 19:20:18

Python 函数注释的相关文章

Python函数

Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以def关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串-用于存放函

Python函数总结

声明和调用函数: 声明函数的方法是用def关键字,函数名及小括号里面的参数列表. def foo(x): print x 调用函数:给出函数名和一小对括号,并放入所需参数: #!/usr/bin/env pythonimport httplibdef check_web_server(host,port,path): h=httplib.HTTPConnection(host,port) h.request('GET',path) resp=h.getresponse() print 'Http

Python函数返回值实例分析

  本文实例讲述了Python的函数返回值用法.分享给大家供大家参考.具体分析如下: 最近学一些Python的基本用法,看到定义函数,发现似乎只能返回一个返回值,想想matlab里返回多个返回值多方便啊,网上查了查,看到有返回多个值的方法. python 函数返回值有两种形式: 1 返回一个值. 2 返回多个值. 现看看返回一个值的吧. ? 1 2 3 4 def firstvalue(a,b): c = a + b return c print firstvalue(1,2) #结果:3 再看

python函数装饰器用法实例详解

  本文实例讲述了python函数装饰器用法.分享给大家供大家参考.具体如下: 装饰器经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计, 有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #! coding=u

总结的几个Python函数方法设计原则

  这篇文章主要介绍了总结的几个Python函数方法设计原则,本文讲解了每个函数只做一件事.保持简单.保持简短.输入使用参数.输出使用return语句等内容,需要的朋友可以参考下 在任何编程语言中,函数的应用主要出于以下两种情况: 1.代码块重复,这时候必须考虑用到函数,降低程序的冗余度 2.代码块复杂,这时候可以考虑用到函数,增强程序的可读性 当流程足够繁杂时,就要考虑函数,及如何将函数组合在一起.在Python中做函数设计,主要考虑到函数大小.聚合性.耦合性三个方面,这三者应该归结于规划与设

Python函数可变参数定义及其参数传递方式实例详解

  本文实例讲述了Python函数可变参数定义及其参数传递方式.分享给大家供大家参考.具体分析如下: python中 函数不定参数的定义形式如下: 1.func(*args) 传入的参数为以元组形式存在args中,如: ? 1 2 3 4 5 6 def func(*args): print args >>> func(1,2,3) (1, 2, 3) >>> func(*[1,2,3]) #这个方式可以直接将一个列表的所有元素当作不定参数 传入(1, 2, 3) 2.

Python函数运算符速查表

问题描述 Python函数运算符速查表,有需求的请自取,免贵姓雷SnoopSnitch-0.9.0.part2.rar

《Python语言程序设计》——3.2 常见的Python函数

3.2 常见的Python函数 关键点:Python提供了许多有用的用于解决常见程序设计任务的函数. 函数是完成一个特殊任务的一组语句.Python语言和其他程序设计语言一样,都提供了一个函数库.你已经使用过eval.input.print和int函数.这些都是内置函数并且在Python解释器里均可用.所以使用这些函数你不用导入任何模块.除此之外,你还可以使用abs.max.min.pow和round等内置函数,如表3-1所示. 例如: 我们常常为解决数学问题创建一些程序.Python的math

python新手求助-python函数返回值存在问题

问题描述 python函数返回值存在问题 python代码 def create_G(n): import networkx as nx link_G = nx.Graph() for j in range(0, count/n): link_G.add_edge(j, j+1) return link_G 我希望这个函数能返回一个图,但是执行的时候显示返回的图为空,请问怎样才能返回一个"正常"的图?