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'>}