如何在python-statemachine实例化时设置从磁盘读取的当前状态?
解决方案:python-statemachine 实例化时加载保存的状态
推荐方案1:自定义状态机子类时添加初始化参数
如果你的状态机是自定义子类,直接在__init__中接收current_state参数,调用官方提供的set_state方法设置初始状态,这是最规范的方式:
from statemachine import StateMachine, State class MyStateMachine(StateMachine): # 定义状态与事件 idle = State("Idle", initial=True) running = State("Running") stopped = State("Stopped") start = idle.to(running) stop = running.to(stopped) reset = stopped.to(idle) def __init__(self, current_state=None, **kwargs): super().__init__(**kwargs) if current_state is not None: # 调用官方API设置状态,会触发内部校验与钩子函数 self.set_state(current_state) # 完全符合你的预期用法 saved_state = "running" # 从磁盘读取的状态值 sm = MyStateMachine(current_state=saved_state) print(sm.current_state) # 输出: State('Running', id='running')
方案2:直接使用默认StateMachine类的处理方式
如果未自定义子类,实例化后立即调用set_state方法,比直接修改属性更安全:
from statemachine import StateMachine, State # 定义状态机结构 states = [ State("Idle", initial=True), State("Running"), State("Stopped"), ] transitions = [ {"trigger": "start", "source": "idle", "dest": "running"}, {"trigger": "stop", "source": "running", "dest": "stopped"}, ] saved_state = "running" sm = StateMachine(states=states, transitions=transitions) # 实例化后调用官方API恢复状态 sm.set_state(saved_state)
不推荐直接修改current_state_value的原因
直接修改该属性会绕过库的内部逻辑:
- 不会触发状态变更的钩子函数(如
on_enter_*、on_exit_*) - 不校验状态是否属于当前状态机的合法集合
- 可能导致状态机内部状态不一致,引发后续事件处理异常
内容的提问来源于stack exchange,提问作者bjorn
相关产品推荐
相关产品推荐

