pythonic命令和事件总线

pybuses的Python项目详细描述


命令和事件总线的pythonic实现

Build StatusCoverage Status

零依赖,灵活实现命令总线。python 3.6+仅

commandbus的基本用法

fromtypingimportListfrompybusesimportCommandBus# Firstly, create command classclassMakeSandwich:def__init__(self,ingredients:List[str])->None:self.ingredients=ingredients# Then create callable responsible for handling command.# It must accept only one argument and is required to have type annotation for it.defsandwich_maker(command:MakeSandwich)->None:print(f'Making sandwich with {command.ingredients}!')# finally, register the handler by subscribingcommand_bus=CommandBus()command_bus.subscribe(sandwich_maker)command_bus.handle(MakeSandwich(['cheese','ham']))

中间产品

中间件是轻量级插件,允许我们在处理给定命令之前和之后注入自定义逻辑。

目前,上下文管理器是定义中间件的唯一受支持的方法。它们简化了异常处理,并指定在处理事件之前还是之后执行中间件逻辑。

importcontextlibfromtypingimport(Any,Generator,)@contextlib.contextmanagerdefexample_middleware(command:Any)->Generator:print(f'Before handling {command}')yieldprint(f'After handling {command}')command_bus=CommandBus([example_middleware])command_bus.subscribe(sandwich_maker)command_bus.handle(MakeSandwich(['cheese','ham']))

eventbus的基本用法

fromdecimalimportDecimalfrompybusesimportEventBus# Create eventclassPaymentMade:amount:Decimalwho:intdef__init__(self,amount:Decimal,who:int)->None:self.amount=amountself.who=whodefhandler(payment_made:PaymentMade)->None:print(f'Oh, cool! {payment_made.who} paid {payment_made.amount / 100}$!')event_bus=EventBus()event_bus.subscribe(handler)event_bus.post(PaymentMade(Decimal('10.99'),123))

事件和命令总线之间的相似性和差异

eventbus可以为每个事件订阅0个或多个处理程序,而commandbus必须为每个命令仅拥有一个处理程序。

CommandBus支持Middleware,而EventBus不支持。

数据类兼容

支持使用dataclasses生成命令/事件

fromdataclassesimportdataclassfromtypingimportListfrompybusesimportCommandBus@dataclassclassMakeSandwich:ingredients:List[str]defhandler(command:MakeSandwich)->None:print(f'dataclass-based command: {command}')command_bus=CommandBus()command_bus.subscribe(handler)command_bus.handle(MakeSandwich(['ham','butter']))

attrs兼容

支持使用attrs生成命令/事件

importattrfrompybusesimportCommandBus@attr.s(frozen=True)classExample:number:int=attr.ib()name:str=attr.ib()defexample_handler(command:Example)->None:print(f'Inside handler of {type(command)} - got {command}!')command_bus=CommandBus()command_bus.subscribe(example_handler)command_bus.handle(Example(number=1,name='Sebastian'))

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

推荐PyPI第三方库


热门话题
java如何将BroadcastReceiver类代码放入服务类中,以便在服务类中注册和注销它?   在Java中根据字符串数组中的项检查输入   键入localhost:8080无法加载java tomcat10主页错误:ERR\u CONNECTION\u被拒绝   java我的程序在BlueJ中的文本“Gross Pay:”后遇到“%.2f”时“崩溃”   使用Servlet和Prepared语句的java UPDATE类找不到异常(MySQL驱动程序)   java如果我使用安装在不同操作系统上的docker使用strictfp,有可能得到不同的结果吗?   java如何在zk中将复选框的onCheck事件传递给其父级?   我们如何通过java中的sftp将文本附加到远程服务器上的现有文件?   java如何将字符串与linkedlist中的字符串进行比较,并将结果作为布尔值插入mysql表   关于Lambda的java。。。。分号   java更改Android容器标题的颜色   java多维数组计算   hibernate 5中的java弃用记录器   java如何读取HOCON配置以将值加载到地图中?   分析如何在生产环境中调试java heap OutOfMemory错误?