Python 函数注解
Python的函数注解功能使您能够在函数定义中添加关于参数的附加解释性元数据,以及关于返回数据类型的信息。
虽然您可以使用Python的文档字符串功能来为函数提供文档,但如果函数的原型发生某些更改,它可能会变得过时。因此,注解功能是根据PEP 3107在Python中引入的。
在执行函数时,Python解释器不考虑这些注解。它们主要用于Python集成开发环境(IDE)为程序员提供详细的文档。
注解可以是添加到参数或返回数据类型的任何有效的Python表达式。注解的最简单示例是指定参数的数据类型。在参数前面加一个冒号后,将注解作为表达式进行声明。
def myfunction(a: int, b: int):
c = a+b
return c
请记住,Python是一种动态类型的语言,在运行时不强制执行任何类型检查。因此,在调用函数时,对参数进行数据类型的注释没有任何效果。即使给出非整数参数,Python也不会检测到任何错误。
def myfunction(a: int, b: int):
c = a+b
return c
print (myfunction(10,20))
print (myfunction("Hello ", "Python"))
它将产生以下 输出 −
30
Hello Python
注解在运行时被忽略,但对于IDE和静态类型检查器库(例如mypy)很有帮助。
您也可以为返回的数据类型提供注解。在括号后面和冒号符号之前,放置一个箭头(->),然后是注解。例如 −
def myfunction(a: int, b: int) -> int:
c = a+b
return c
由于在运行时忽略数据类型作为注释,因此您可以将任何充当参数元数据的表达式放置在其中。因此,函数可以具有任意的表达式作为注释,如以下示例所示−
def total(x : 'marks in Physics', y: 'marks in chemistry'):
return x+y
如果你想在注释中指定一个默认参数,你需要将其放在注释表达式之后。默认参数必须在参数列表中的必需参数之后。
def myfunction(a: "physics", b:"Maths" = 20) -> int:
c = a+b
return c
print (myfunction(10))
Python中的函数也是一个对象,它的属性之一是annotations。你可以使用dir()函数来检查。
print (dir(myfunction))
这将打印包含annotations作为其中一个属性的myfunction对象列表。
['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
annotations属性本身是一个字典,其中参数是键,注释是值。
def myfunction(a: "physics", b:"Maths" = 20) -> int:
c = a+b
return c
print (myfunction.__annotations__)
它会产生以下的 输出 −
{'a': 'physics', 'b': 'Maths', 'return': <class 'int'>}
你可以为函数使用任意位置和/或任意关键字参数。也可以为它们提供注释。
def myfunction(*args: "arbitrary args", **kwargs: "arbitrary keyword args") -> int:
pass
print (myfunction.__annotations__)
它将产生以下 输出 −
{'args': 'arbitrary args', 'kwargs': 'arbitrary keyword args', 'return': <class 'int'>}
如果您需要为一个函数参数提供多个注释表达式,可以将其以字典对象的形式放在参数之前。
def division(num: dict(type=float, msg='numerator'), den: dict(type=float, msg='denominator')) -> float:
return num/den
print (division.__annotations__)
它将产生以下 输出 –
{'num': {'type': <class 'float'>, 'msg': 'numerator'}, 'den': {'type': <class 'float'>, 'msg': 'denominator'}, 'return': <class 'float'>}