How to implement a state that automatically transitions to the previous state with pytransitions

45 Views Asked by At

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
0

There are 0 best solutions below