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 也必须能接收两个实参。否则调用出错。