如何用python-statemachine事件语法实现多状态按预定义序列流转?
Python Statemachine 最佳实践:事件驱动流转与动作回调实现
核心实现思路
直接利用python-statemachine的事件语法(|运算符)定义状态流转规则,将工作动作绑定为事件回调,外部仅通过触发事件完成状态切换与业务逻辑执行,彻底替代冗余的if判断。
完整代码示例
from statemachine import StateMachine, State class MachineStateMachine(StateMachine): # 定义状态 off = State("Off", initial=True) standby = State("Standby") on = State("On") # 用|运算符定义事件与对应流转 power_on = off.to(standby) activate = standby.to(on) # 绑定工作动作回调,流转同时执行业务逻辑 do_work = on.to(standby) | "perform_work" def perform_work(self): # 这里编写具体工作逻辑 print("正在执行工作任务...") # 可添加业务逻辑,比如数据处理、设备操作等
代码说明
- 状态定义:明确声明
off(初始态)、standby、on三个状态,匹配你描述的a→b→c→b流转模型。 - 事件流转:
power_on事件触发从off到standby的切换activate事件触发从standby到on的切换do_work事件通过|运算符同时绑定状态流转(on→standby)和回调方法perform_work,触发事件时自动执行工作逻辑并完成状态切换
- 动作回调:
perform_work作为状态机内部的业务方法,仅通过do_work事件对外暴露,外部无需关心状态判断逻辑。
外部调用示例
# 实例化状态机 machine = MachineStateMachine() # 触发事件完成流转与动作执行 machine.power_on() print(f"当前状态:{machine.current_state.name}") # 输出:Standby machine.activate() print(f"当前状态:{machine.current_state.name}") # 输出:On machine.do_work() # 输出:正在执行工作任务... print(f"当前状态:{machine.current_state.name}") # 输出:Standby
关键优势
- 完全消除冗余的
if状态判断,流转规则通过事件声明式定义,可读性与维护性大幅提升 - 业务动作与状态流转解耦,回调方法专注于业务逻辑,事件负责状态切换逻辑
- 外部调用仅依赖事件接口,无需感知内部状态细节,符合封装原则
内容的提问来源于stack exchange,提问作者HenryShines
相关产品推荐
相关产品推荐

