Python 参数类型和函数方法的注解

发布时间:2024年01月18日

Python的注解(Annotations)是在函数定义中给参数和返回值添加元数据的一种方式。注解不会影响程序的运行结果,但可以为函数的调用者和维护者提供更多的信息和文档。

下面以几个简单的例子来说明Python的注解和注解函数运行时参数的传递过程。

例子1:给函数参数添加注解
下面是一个简单的函数,用来计算两个数的和:

def add(a, b):
? ? return a + b



我们可以使用注解来说明参数的类型:

def add(a: int, b: int) -> int:
? ? return a + b



在这个例子中,注解a: int和b: int表示a和b应该是整数类型。而注解-> int表示函数的返回值应该是整数类型。这样做的好处是可以帮助调用者理解这个函数应该传入什么类型的参数,以及返回值的类型是什么。

当调用add函数时,可以传入任意类型的参数,Python不会检查参数的类型是否与注解匹配,但我们可以通过__annotations__属性来查看函数的注解信息:

>>> add.__annotations__

{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

例子2:给函数返回值添加注解
我们可以给函数的返回值添加注解,来说明函数应该返回什么类型的值:

def add(a: int, b: int) -> int:
? ? return a + b



在这个例子中,注解-> int表示函数的返回值应该是整数类型。这样做的好处是可以帮助调用者理解这个函数应该返回什么类型的值。

当调用add函数时,返回的值可以是任意类型,Python不会检查返回值的类型是否与注解匹配。但我们可以通过__annotations__属性来查看函数的注解信息:

>>> add.__annotations__

{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

例子3:注解函数的参数
有时候,我们需要在函数执行前或执行后对参数进行检查或处理。可以使用注解来实现这个功能:

def check_args(func):
? ? def wrapper(*args: int, **kwargs: int):
? ? ? ? for arg in args:
? ? ? ? ? ? if not isinstance(arg, int):
? ? ? ? ? ? ? ? raise TypeError(f"{arg} should be int")
? ? ? ? for arg in kwargs.values():
? ? ? ? ? ? if not isinstance(arg, int):
? ? ? ? ? ? ? ? raise TypeError(f"{arg} should be int")
? ? ? ? return func(*args, **kwargs)
? ? return wrapper

@check_args
def add(a, b):
? ? return a + b



在这个例子中,我们定义了一个名为check_args的装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapper

新函数wrapper使用了注解args: int和**kwargs: int,表示args和**kwargs中的所有参数都应该是整数类型。

在wrapper函数中,我们使用了循环来遍历args和kwargs中的所有参数,并检查它们的类型是否为整数。如果发现有不是整数类型的参数,就抛出一个TypeError异常。

最后,我们调用原函数func并将args和kwargs作为参数传递给它。这样就保证了函数执行前所有参数都是整数类型。

当我们使用@check_args装饰器来装饰add函数时,实际上是将add函数替换为wrapper函数。这样,在调用add函数时,wrapper函数会先执行参数检查,然后再调用原函数add。

下面是一个使用check_args装饰器的例子:

>>> add(1, 2)
3

>>> add(1, '2')

Traceback (most recent call last):

TypeError: 2 should be int
在这个例子中,我们调用add(1, 2)时,由于参数都是整数类型,因此可以正常计算并返回结果。而当我们调用add(1, ‘2’)时,由于第二个参数不是整数类型,因此会抛出一个TypeError异常。
?

文章来源:https://blog.csdn.net/a2401877437/article/details/135665255
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。