A high-performance, simple-structured event system, relies on asyncio
Project description
Letoderea
一个高性能,结构简洁,依赖于 Python内置库asyncio
的事件系统, 设计灵感来自Graia BroadcastControl
。
项目仍处于开发阶段,部分内容可能会有较大改变
安装
从 PyPI 安装
pip install arclet-letoderea
样例
from arclet.letoderea import EventSystem, Contexts
es = EventSystem()
class TestEvent:
async def gather(self, context: Contexts):
context["name"] = "Letoderea"
@es.on()
async def test_subscriber(name: str):
print(name)
es.loop.run_until_complete(es.publish(TestEvent()))
说明
事件
- 事件可以是任何对象,只要实现了
gather
异步方法 gather
方法的参数为Contexts
类型,用于传递上下文信息- 事件可以通过
gather
方法将自身想要传递的信息整合进Contexts
中 - 事件系统支持直接查找属性, 例如
Event.name
可以直接注入进foo(name: str)
的参数中 - 事件可以携带
Provider
与Auxiliary
,它们会在事件被订阅时注入到订阅者中
订阅
- 通过
EventSystem.on
或subscribe
装饰器可以将一个函数注册为事件的订阅者 - 订阅者的参数可以是任何类型,事件系统会尝试从
Contexts
中查找对应的值并注入 - 默认情况下
event
为名字的参数会被注入为事件的实例 - 订阅者可以设置优先级,值越小优先级越高
上下文
Contexts
类型是一个dict
的子类,用于传递上下文信息Contexts
默认包含event
键,其值为事件的实例Contexts
默认包含$subscriber
键,其值为订阅者的实例
依赖注入
Provider[T]
负责管理参数的注入, 其会尝试从Contexts
中选择需求的参数返回- 对于订阅者的每个参数,在订阅者注册后,事件系统会遍历该订阅者拥有的所有
Provider
, 并依次调用Provider.validate
方法,如果返回True
,则将该Provider
绑定到该参数上。 当进行依赖解析时,事件系统会遍历该参数绑定的所有Provider
,并依次调用Provider.__call__
方法, 如果返回值不为None
,则将该返回值注入到该参数中。 Provider.validate
方法用于验证订阅函数的参数是否为该Provider
可绑定的参数。默认实现为检查目标参数的类型声明是否为T
。 也可以通过重写该方法来实现自定义的验证逻辑。Provider.__call__
方法用于从Contexts
中获取参数- 原则上
Provider
只负责注入单一类型的参数。若想处理多个类型的参数,可以声明自己为Provider[Union[A, B, ...]]
类型, 并在Provider.validate
方法中进行自定义的逻辑判断。但更推荐的做法是构造多个Provider
,并将其绑定到同一个参数上。 - 对于特殊的辅助器
Depend
,事件系统会将其作为特殊的Provider
处理,绑定了Depend
的参数在解析时将直接调用Depend.__call__
方法。
事件发布
- 一般情况下通过
EventSystem.publish
方法可以发布一个事件让事件系统进行处理 Publisher
类负责管理订阅者与事件的交互Publisher.validate
方法用于验证该事件是否为该发布者的订阅者所关注的事件Publisher.publish
方法用于将事件不经过事件系统主动分发给订阅者Publisher.supply
方法用于让事件系统主动获取事件并分发给订阅者EventSystem.on
与EventSystem.publish
可以指定Publisher
,默认为事件系统内的全局Publisher
辅助
Auxiliary
提供了一系列辅助方法,方便事件的处理Auxiliary
分为Judge
,Supply
与Depend
三类:Judge
: 用于判断此时是否应该处理事件Supply
: 用于为Contexts
提供额外的信息Depend
: 用于依赖注入
Auxiliary.scopes
声明了Auxiliary
的作用域:prepare
: 表示该Auxiliary
会在依赖注入之前执行parsing
: 表示该Auxiliary
会在依赖注入解析时执行complete
: 表示该Auxiliary
会在依赖注入完成后执行cleanup
: 表示该Auxiliary
会在事件处理完成后执行
Auxiliary
可以设置CombineMode
, 用来设置多个Auxiliary
的组合方式:single
: 表示该Auxiliary
独立执行and
: 表示该Auxiliary
的执行结果应该与其他Auxiliary
的执行结果都为有效值or
: 表示该Auxiliary
的执行结果应该与其他Auxiliary
的执行结果至少有一个为有效值
开源协议
本实现以 MIT 为开源协议。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
arclet-letoderea-0.7.0.tar.gz
(21.0 kB
view details)
Built Distribution
File details
Details for the file arclet-letoderea-0.7.0.tar.gz
.
File metadata
- Download URL: arclet-letoderea-0.7.0.tar.gz
- Upload date:
- Size: 21.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: pdm/2.8.2 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 02097002aff8053da2fb00da648864d1c0123d22c425f71e8da53269cfecc313 |
|
MD5 | d58d105e1dd236af08662100d212b1e9 |
|
BLAKE2b-256 | eccbf3245ae6653e032cfce775f26c77ad73ded1e683d0bde8b96838436da34c |
Provenance
File details
Details for the file arclet_letoderea-0.7.0-py3-none-any.whl
.
File metadata
- Download URL: arclet_letoderea-0.7.0-py3-none-any.whl
- Upload date:
- Size: 20.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: pdm/2.8.2 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b50aa684a8660597c16a39dff9b9f585d4f9597a2dc51b04d27f298794979089 |
|
MD5 | 65c06e99d49e7fcb19bd525475463f34 |
|
BLAKE2b-256 | 2ddce8ce5d66fc655503ef4c4562a6c710b406476ed0c75f1ace0c540765283c |