我已經使自己成爲一個簡單的python事件系統,並且我發現每次觸發事件的方式幾乎都是一樣的:無論是在通話結束還是在之前。感覺這是一件很棒的事情,可以作爲裝飾者。下面是我使用的代碼:我可以使用函數結果的屬性作爲裝飾器嗎?
from functools import wraps
def fires(event):
"""
Returns a decorater that causes an `Event` to fire immediately before the
decorated function is called
"""
def beforeDecorator(f):
"""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):
"""Fires the event after the function executes"""
@wraps(f)
def wrapped(*args, **kargs):
result = f(*args, **kargs)
event.fire(*args, **kargs)
return result
return wrapped
# Should allow more explicit `@fires(event).uponCompletion` and
# `@fires(event).whenCalled`
afterDecorator.onceComplete = afterDecorator
afterDecorator.whenCalled = afterDecorator
return afterDecorator
有了這個代碼,我可以成功地寫:
@fires(myEvent)
def foo(y):
return y*y
print func(2)
和一切正常。當我試圖寫這個問題時:
@fires(myEvent).onceComplete
def foo(y):
return y*y
print func(2)
這給我一個語法錯誤。是否有一些複雜裝飾器的特殊語法?解析器在第一組括號後停止嗎?
不只是任何表達式都可以用作裝飾器。例如'@(lambda f:f())'不起作用。 – wberry 2012-03-23 19:59:06