2012-06-24 12 views
7

Django में Signals सिस्टम बनाया गया है और यह उस परियोजना के लिए काफी उपयोगी होगा जिस पर मैं काम कर रहा हूं।क्या पिरामिड में सिग्नल/स्लॉट सिस्टम है

मैं पिरामिड दस्तावेज़ों के बावजूद पढ़ रहा हूं और ऐसा लगता है कि यह Events सिस्टम है जो सिग्नल के बहुत करीब से बंधे हुए हैं, लेकिन काफी नहीं। क्या इस काम को सामान्य प्रयोजन सिग्नल सिस्टम के लिए कुछ चाहिए या मुझे अपना खुद का रोल करना चाहिए?

उत्तर

9

पिरामिड द्वारा उपयोग की जाने वाली घटना प्रणाली सिग्नल सिस्टम के समान सटीक उपयोग-मामलों को पूरा करती है। आपका आवेदन मनमाने ढंग से घटनाओं को परिभाषित कर सकता है और ग्राहकों को उनके साथ जोड़ सकता है।

नया ईवेंट बनाने, इसके लिए एक इंटरफेस को परिभाषित करने के लिए:

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' 

तुम भी IMyOwnEvent इंटरफ़ेस बजाय MyOwnEvent वर्ग के उपयोग कर सकते हैं और अपने ग्राहक सभी घटनाओं है कि इंटरफ़ेस, न सिर्फ अपने उस घटना के विशिष्ट कार्यान्वयन लागू की सूचना दी जाएगी।

ध्यान दें कि ग्राहकों को सूचित करना कभी अपवाद नहीं लेता है (जैसे Django में send_robust)।

संबंधित मुद्दे