DjangoにはSignalsシステムが組み込まれており、私が取り組んでいるプロジェクトにとっては非常に便利です。ピラミッドにシグナル/スロットシステムがあります
私はピラミッドのドキュメントを読んできましたが、信号に非常に密接に結びついているが、それほど正確ではないEventsシステムがあるようです。このようなものは、汎用信号システムのために働くのでしょうか、それとも私は自分自身を回すべきですか?
DjangoにはSignalsシステムが組み込まれており、私が取り組んでいるプロジェクトにとっては非常に便利です。ピラミッドにシグナル/スロットシステムがあります
私はピラミッドのドキュメントを読んできましたが、信号に非常に密接に結びついているが、それほど正確ではないEventsシステムがあるようです。このようなものは、汎用信号システムのために働くのでしょうか、それとも私は自分自身を回すべきですか?
Pyramidで使用されるイベントシステムは、Signalsシステムと全く同じユースケースを満たします。アプリケーションで任意のイベントを定義し、そのイベントにサブスクライバをアタッチすることができます。
そのためのインタフェースを定義し、新しいイベントを作成するには:
from zope.interface import (
Attribute,
Interface,
)
class IMyOwnEvent(Interface):
foo = Attribute('The foo value')
bar = Attribute('The bar value')
あなたは、イベントの実際の実装定義:
from zope.interface import implementer
@implementer(IMyOwnEvent)
class MyOwnEvent(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
をインターフェースは、実際にオプションですが、助け複数の実装を提供するのが容易になります。だから、インターフェースの定義と、@implementer
の部分を一切省略することで逃げることができました。
このイベントを通知する場所は、registry.notify
メソッドを使用します。ここで私はあなたのレジストリを達成するために利用可能な要求を持っていると仮定します。
request.registry.notify(MyOwnEvent(foo, bar))
これは、あなたが登録したすべての加入者にリクエストをお送りします。 config.add_subscriper
またはpyramid.events.subscriber
で次のいずれか
from pyramid.events import subscriber
from mymodule.events import MyOwnEvent
@subscriber(MyOwnEvent)
def owneventsubscriber(event):
event.foo.spam = 'eggs'
また、代わりにMyOwnEvent
クラスのIMyOwnEvent
インタフェースを使用することができますし、あなたの加入者は、そのイベントのあなたの特定の実装だけではなく、インタフェースを実装するすべてのイベントが通知されます。
通知者には例外が発生しません(Djangoのsend_robust
など)。