如何用两个argument功能实现装饰器

时间:2020-02-15 09:51:00

标签: python

我以前没有使用过装饰器,但是现在我需要实现一些可比较的测试来比较一些数据列表,并且我想为此使用更少的代码。我希望有一个功能可以比较两个数据集的数据列表。

 def compare(a,b):
    for j, c in zip(a, b):
        try:
            assert j == c
        except AssertionError:
            raise AssertionError(f"\n{a} arr1: {j}\n{b} arr2:  {c}")

这是两个列表:

arr1 = [arg1, arg2, arg3, arg4]
arr2 = [arg1, arg2, arg3, arg4]

我正在创建装饰器:

def decor(func):
    def comp(a,b):
        for j, c in zip(a, b):
            try:
                assert j == c
            except AssertionError:
                raise AssertionError(f"\n{a}: {j}\n{b}:  {c}")
            func()
    return comp

然后使用两个列表定义方法:

@decor
def lists():
    arr1 = [arg1, arg2, arg3, arg4]
    arr2 = [arg1, arg2, arg3, arg4]
    return arr1, arr2

但是我遇到一个错误,不知道如何设置预期的参数:

TypeError: comp() missing 2 required positional arguments: 'a' and 'b'

1 个答案:

答案 0 :(得分:0)

如果您知道函数将返回两个列表,并且必须使用修饰符执行此操作,则建议暂时将compare(a,b)函数分开,以使其简单。然后在装饰器中:

def decor(func):
    def wrapper(*a, **kw):
        a, b = func(*a, **kw)
        compare(a,b)
        return a, b
    return wrapper