金字塔是否有信号/槽系统

时间:2012-06-24 09:01:55

标签: python signals pylons pyramid

Django恰好内置了Signals系统,对我正在开发的项目非常有用。

我一直在阅读金字塔文档,它似乎有一个Events系统与信号非常接近,但并不完全。像这样的东西适用于通用信号系统还是我应该自己动手?

1 个答案:

答案 0 :(得分:9)

Pyramid使用的事件系统实现了与信号系统完全相同的用例。您的应用程序可以定义任意事件并将订阅者附加到它们。

要创建新事件,请为其定义接口:

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会这样做)。