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

本文介绍了Python中如何使用注解为函数参数和返回值添加类型信息,以及装饰器check_args在参数检查中的应用。通过例子展示了注解的使用和其在提高代码可读性和错误检测中的作用。
摘要由CSDN通过智能技术生成

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异常。
 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值