3. 带有参数和返回值的函数的装饰器

当被装饰函数有参数和返回值,则装饰器返回的函数也必须有同样的参数和返回值。

本节目标:

arguments = []
result_numbers = []

def recorder_operation_deco(fn):
    '''此装饰器实现将被装饰函数的参数形成元组(n1, n2) 放入 arguments列表
    将运 行的结果放入 result_numbers 列表。'''
    def operations(n1, n2):
        arguments.append((n1, n2))
        r = fn(n1, n2)
        result_numbers.append(r)
        return r
    return operations

@recorder_operation_deco
def myadd(a, b):
    return a + b

@recorder_operation_deco
def mymul(x, y):
    return x * y

print('1 + 2 =', myadd(1, 2))
print('3 * 4 =', mymul(3, 4))

print('所有的参数:', arguments)  # [(1, 2), (3, 4)]
print('所有的结果:', result_numbers)  # [3, 12]

上述程序用,因为被装饰函数 myadd 和 mymul 都有两个形参。因此装饰器函数返回的函数 operations 也必须能接收两个实参。否则调用出错。