您的应用程序组件可以通过发送和监听事件来进行通信。

pyeventdispatcher的Python项目详细描述


PyEventDispatcher

masterdevelopPyPIPythonLicence
Build StatusBuild StatusPyPI

pyeventdispatcher允许应用程序组件与每个 另一种方法是发送事件并倾听它们。 这个库的灵感来自symfony的event-dispatcher组件。

免责声明

图书馆正处于发展的早期阶段。很多事情可能会改变,也可能不会像预期的那样工作,包括打破改变。

最简单的示例

frompyeventdispatcherimportdispatch,Event,registerregister("foo.bar",lambdaevent:print(f"{event.name}::{event.data}"))dispatch(Event("foo.bar","some data"))# foo.bar::some data

安装

pip install pyeventdispatcher

听众

任何callable都可以注册为侦听器, 唯一的要求是它接受一个参数event

下面的函数是您可以定义的最简单的侦听器示例:

defmy_listener(event):print(event.name)

注册全局侦听器

有几种注册全局侦听器的方法,您可以在整个应用程序中混合样式或保留一种样式。

register函数

frompyeventdispatcherimportregisterdefmy_func(event):print(event.name)register("foo.bar",my_func)register("bar.foo",my_func,-100)

listen装饰器

frompyeventdispatcherimportlisten@listen("foo.bar",("bar.foo",-100))defmy_func(event):print(event.name)

通过扩展EventSubscriber

frompyeventdispatcherimportEventSubscriber,register_event_subscribersclassMySubscriber(EventSubscriber):EVENTS={"foo.bar":"execute_one","bar.foo":("execute_two",-100)}@staticmethoddefexecute_one(event):print(event.name)@staticmethoddefexecute_two(event):print(event.name)register_event_subscribers()# Register your classes

本地侦听器

在大多数情况下,您的应用程序只需要一个侦听器的全局注册 整个应用程序。

buf如果需要,可以根据需要初始化任意多个eventdispatcher实例。他们每个人都会 侦听器的本地注册表。

frompyeventdispatcherimportEventDispatcher,register# Register listener in  global registryregister("foo.bar",lambdaevent:print("global listener"))# Initialise instances of local EventDispatcherpy_event_dispatcher_1=EventDispatcher()py_event_dispatcher_1.register("foo.bar",lambdaevent:print("event dispatcher 1"))py_event_dispatcher_2=EventDispatcher()py_event_dispatcher_2.register("foo.bar",lambdaevent:print("event dispatcher 2"))

使用执行优先级注册侦听器

侦听器按优先级参数的值顺序执行,该值默认设置为“0”。

您可以更改已注册侦听器的优先级,以定义执行该侦听器的顺序。

frompyeventdispatcherimportregisterregister("foo.bar",lambdaevent:print("second"))register("foo.bar",lambdaevent:print("first "),-100)# first second

发送事件

当您分派事件时,侦听指定事件发生的每个已注册侦听器, 将使用事件对象作为参数调用。

调度全局事件

frompyeventdispatcherimportdispatch,Event,registerregister("foo.bar",lambdaevent:print(event.name))dispatch(Event("foo.bar",{"id":1}))

调度本地事件

frompyeventdispatcherimportEventDispatcher,Event,registerregister("foo.bar",lambdaevent:print(f"{event.name}::global"))# Initialise separated instancepy_event_dispatcher=EventDispatcher()py_event_dispatcher.register("foo.bar",lambdaevent:print(f"{event.name}::local"))# Dispatch event to both global and local listenerspy_event_dispatcher.dispatch(Event("foo.bar"))# foo.bar::global# foo.bar::local# Dispatch event to local listeners onlypy_event_dispatcher.dispatch(Event("foo.bar"),False)# foo.bar::local

停止传播

有时您可能希望停止事件的传播,因为您只需将event.stop设置为True

在下面的示例中,只执行first_listener

frompyeventdispatcherimportregisterdeffirst_listener(event):event.stop=Trueprint("first_listener")defsecond_listener(event):print("first_listener")register("foo.bar",first_listener)register("foo.bar",second_listener)# first_listener

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何获得@sign,以便在Java代码中键入@override?   java Facebook登录不起作用,我忘了什么?   json如何在java中从MongoDB Atlas获取特定字段?   java如何在Android上的JNI中实现委托/协议(在iOS上)?   java为什么这个循环多次的程序在循环后有一个“println”时需要花费时间?   java无法使组合框正常工作   JavaCQ5。如何为作者显示列表发布者?版本5.5   java我可以要求泛型参数具有泛型参数吗?   JavaOKHTTP无法获取整个JSON   数组Java:用字符减去字符意味着什么?   java为什么Eclipse content assist无法从部分方法名生成方法存根?   java使用线程在Android Studio中一次加载一个多位图   java遍历二叉树并返回一个值