2012-06-24 14 views
7

Django hat zufällig ein Signals System eingebaut und es wäre sehr nützlich für ein Projekt, an dem ich gerade arbeite.Hat Pyramid ein Signal/Slot-System?

Ich habe gelesen, obwohl die Pyramide Dokumente und es scheint, ein Events System zu haben, das sehr eng an Signale gebunden ist, aber nicht ganz. Würde so etwas für ein Signal-System für allgemeine Zwecke funktionieren, oder sollte ich selbst eine Rolle spielen?

Antwort

9

Das von Pyramid verwendete Ereignissystem erfüllt genau die gleichen Anwendungsfälle wie das Signalsystem. Ihre Anwendung kann beliebige Ereignisse definieren und Abonnenten anhängen.

Um ein neues Ereignis zu erstellen, eine Schnittstelle für sie definieren:

from zope.interface import (
    Attribute, 
    Interface, 
    ) 

class IMyOwnEvent(Interface): 
    foo = Attribute('The foo value') 
    bar = Attribute('The bar value') 

Sie dann eine tatsächliche Durchführung der Veranstaltung definieren:

from zope.interface import implementer 

@implementer(IMyOwnEvent) 
class MyOwnEvent(object): 
    def __init__(self, foo, bar): 
     self.foo = foo 
     self.bar = bar 

Die Schnittstelle tatsächlich optional ist, sondern hilft Dokumentation und erleichtert die Bereitstellung mehrerer Implementierungen. So können Sie die Schnittstellendefinition und @implementer Teile weglassen.

Wenn Sie dieses Ereignis signalisieren möchten, verwenden Sie die Methode registry.notify; hier gehe ich davon aus Sie eine Anfrage haben, die Registrierung zu erreichen:

request.registry.notify(MyOwnEvent(foo, bar)) 

Das wird die Anfrage an beliebige Abonnenten senden Sie angemeldet haben; entweder mit config.add_subscriper oder mit pyramid.events.subscriber:

from pyramid.events import subscriber 
from mymodule.events import MyOwnEvent 

@subscriber(MyOwnEvent) 
def owneventsubscriber(event): 
    event.foo.spam = 'eggs' 

können Sie auch die IMyOwnEvent Schnittstelle statt der MyOwnEvent Klasse und Ihre Teilnehmer werden über alle Ereignisse informiert werden, die die Schnittstelle implementieren, nicht nur Ihre konkrete Umsetzung dieses Ereignisses.

Beachten Sie, dass die Benachrichtigung von Abonnenten niemals Ausnahmen erfasst (wie in Django send_robust).