<p>我添加了before和after变量的预计算(由于invoke技巧,所有闭包都是在导入时创建的,只要应用decorator就可以使用),使选择依赖于metadecorator的可选参数,并放入try/finally块以确保after事件始终触发。通过这种方法,函数属性的问题变得毫无意义。你知道吗</p>
<pre><code>invoke = lambda f: f() # trick used in JavaScript frameworks all the time
@invoke # closure becomes fires
def fires():
def beforeDecorator(f, event):
"""Fires the event before the function executes"""
@wraps(f)
def wrapped(*args, **kargs):
event.fire(*args, **kargs)
return f(*args, **kargs)
return wrapped
def afterDecorator(f, event):
"""Fires the event after the function executes"""
@wraps(f)
def wrapped(*args, **kargs):
try:
result = f(*args, **kargs)
finally:
event.fire(*args, **kargs)
return result
return wrapped
def closure(event, after=False): # becomes fires
def decorator(function):
if after:
return afterDecorator(function, event)
else:
return beforeDecorator(function, event)
return decorator
return closure
</code></pre>