You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:09:54