私は自分自身をPythonのシンプルなイベントシステムにしました。イベントの発生方法は毎回ほぼ同じでした。コール終了時か、その前のどちらかでした。これはデコレータとして持っているのがいいことだと感じました。ここで私が使用しているコードです:関数の結果のプロパティをデコレータとして使用できますか?
@fires(myEvent)
def foo(y):
return y*y
print func(2)
を、すべてが動作します:
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).onceComplete
def foo(y):
return y*y
print func(2)
これは私に構文エラーをもたらします。複雑なデコレータの特殊な構文はありますか?パーサーは、最初の括弧の後に停止しますか?
デコレータとしてだけでなく、例えば '@(lambda f:f())'は動作しません。 – wberry