Python构造一个带参数的装饰器类

2022-05-03 00:00:00 参数 构造 装饰

代码定义了一个用于检测参数类型的Python装饰器类,装饰器可以检测传递给函数的参数是否正确,如果不正确则函数调用会失败,并报告参数错误的信息。

"""
皮蛋编程(https://www.pidancode.com)
创建日期:2022/4/6
功能描述:Python构造一个带参数的装饰器类
"""
import functools


# 构建带参数的装饰器类
class ParamCheck(object):

    def __init__(self, *types, **kwtypes):
        self.types = types
        self.kwtypes = kwtypes
        return

    def __call__(self, func):
        @functools.wraps(func)
        def _inner(*args, **kwargs):
            result = [isinstance(_param, _type) for _param, _type in zip(args, self.types)]
            assert all(result), "参数检查: invalid parameters"
            result = [isinstance(kwargs[_param], self.kwtypes[_param]) for _param in kwargs if _param in self.kwtypes]
            assert all(result), "参数检查: invalid parameters"
            return func(*args, **kwargs)

        return _inner


# 使用装饰器
@ParamCheck(int, str, (list, tuple))
def test_func(a, b, c):
    print("test_func: a=%s, b=%s, c=%s" % (a, b, c))
    return 1


test_func(1, '2', ([1, 2, 3], (1, 2)))

输出:
test_func: a=1, b=2, c=([1, 2, 3], (1, 2))

如果有某个参数的数据类型不对,则会提示相关报错信息。
代码在Python3.9下测试通过。

相关文章