【发布时间】:2014-04-26 09:41:09
【问题描述】:
我想创建一个自定义装饰器,名为captain_hook。它应该存储 hooks - 在装饰函数之前调用的函数 - 并调用它们:
def captain_hook(func):
def closure(hooks=[], *args, **kwargs):
for hook in hooks:
hook(*args, **kwargs)
return func(*args, **kwargs)
return closure
现在我可以说:
@captain_hook
def sum(a, b):
return a+b
sum.__defaults__[0].append(lambda arg: sys.stdout.write(str(arg))) #this lambda function prints argument
sum(1, 2) #should write (1, 2) and return 3
问题是我无法将参数传递给closure,导致args 的第一个元素错误地解包为hooks 参数:sum(1, 2) 设置hook=1、a=2、b - undefined。我该怎么做?
【问题讨论】:
-
你打算什么时候通过钩子?按照您的设置方式,您在使用
captain_hook时不指定任何挂钩,在调用sum时也不提供任何挂钩,因此不涉及挂钩。你想在函数定义时或调用时指定钩子吗? -
@BrenBarn 我编辑了问题。在调用该函数之前,我将安装钩子。当我创建新对象时,它将受到函数调用的影响并且应该适应变化,它的钩子将被调用。通过更改
sum.__defaults__来安装挂钩。
标签: python arguments decorator