I am trying to implement a "state blip", a special state which will automatically transition back to the previous state the machine was in before entering this special state with pytransitions.
Here's what I came up with. It seems to work but I was just wondering if there is a better / cleaner way to do this and if there are any caveats I should be aware of.
states = ['state0', 'state1', 'state2', 'paused']
transitions = [
{
'trigger': 'pause',
'source': ['state0', 'state1', 'state2'],
'dest': 'paused',
'before': 'before_pause'
},
{
'trigger': 'resume',
'source': 'paused',
'dest': None,
'before': 'before_resume'
}
]
machine = Machine(model=None, states=states, transitions=transitions, send_event=True, initial='state0')
class MyModel():
def before_pause(self, event):
self._previous_state = event.state.name
def before_resume(self, event):
event.machine.events['resume'].transitions['paused'][0].dest = self._previous_state
model0 = MyModel()
model1 = MyModel()
model2 = MyModel()
machine.add_model(model0)
machine.add_model(model1)
machine.add_model(model2)
Testing:
model1.to_state1()
model2.to_state2()
print(f"model0={model0.state}, model1={model1.state}, model2={model2.state}")
# model0=state0, model1=state1, model2=state2
machine.dispatch('pause')
print(f"model0={model0.state} from {model0._previous_state}, model1={model1.state} from {model1._previous_state}, model2={model2.state} from {model2._previous_state}")
# model0=paused from state0, model1=paused from state1, model2=paused from state2
machine.dispatch('resume')
print(f"model0={model0.state}, model1={model1.state}, model2={model2.state}")
# model0=state0, model1=state1, model2=state2