3

私は Python を初めて使用し、実際のアプリケーションを構築しながら、言語を通じて自分の道を探っています。現在、私はイベントベースのアプリを構築しようとしており、関数をリスナーとして追加する方法としてデコレータを使用することを考えていました:

@onEvent(eventSpecificArgument)
def foo():
    print('foo')

上記の例では、関数 foo をイベントのリスナーとして追加し、デコレーターによって使用される引数を渡しました。

これは私が望むものに対する可能な(そして十分に賢い)解決策ですか?もしそうなら、どうすればそれを実装できますか/すべきですか?

4

1 に答える 1

4

確かに、デコレータは単なる callableです。デコレータ表記は単なる構文糖衣であり、あなたの例は次のように変換されます。

def foo():
    print('foo')
foo = onEvent(eventSpecificArgument)(foo)

そのため、onEvent()callable は呼び出すことができるものを返す必要があります。その「何か」が渡されfooます。

onEvent返された「何か」の中で何をするかはあなた次第です。

次のようなものが機能します。

registry = {}

def onEvent(eventname):
    def eventdecorator(func):
        registry.setdefault(eventname, []).append(func)
        return func
    return eventdecorator

funcこれは、特定のイベント名のレジストリに追加するだけで、関数を変更せずに返します。

後でイベントを処理する必要がある場合は、そのイベントのイベント ハンドラーを次のように検索します。

for func in registry.get(eventname, ()):
    func()
于 2013-04-12T21:16:51.800 に答える