Note
Go to the end to download the full example code
Reusing transitionsΒΆ
This example helps to turn visual the different compositions of how to declare and bind Transitions to Event.
Note
Even sharing the same transition instance, only the transition actions associated with the event will be called.
- TrafficLightMachine
The same transitions are bound to more than one event.
- TrafficLightIsolatedTransitions
We define new transitions, thus, isolating the connection between states.
from statemachine import State
from statemachine import StateMachine
class TrafficLightMachine(StateMachine):
"A traffic light machine"
green = State(initial=True)
yellow = State()
red = State()
slowdown = green.to(yellow)
stop = yellow.to(red)
go = red.to(green)
cycle = slowdown | stop | go
def before_slowdown(self):
print("Slowdown")
def before_cycle(self, event: str, source: State, target: State, message: str = ""):
message = ". " + message if message else ""
return f"Running {event} from {source.id} to {target.id}{message}"
def on_enter_red(self):
print("Don't move.")
def on_exit_red(self):
print("Go ahead!")
Run a transition
sm = TrafficLightMachine()
sm.send("cycle")
'Running cycle from green to yellow'
class TrafficLightIsolatedTransitions(StateMachine):
"A traffic light machine"
green = State(initial=True)
yellow = State()
red = State()
slowdown = green.to(yellow)
stop = yellow.to(red)
go = red.to(green)
cycle = green.to(yellow) | yellow.to(red) | red.to(green)
def before_slowdown(self):
print("Slowdown")
def before_cycle(self, event: str, source: State, target: State, message: str = ""):
message = ". " + message if message else ""
return f"Running {event} from {source.id} to {target.id}{message}"
def on_enter_red(self):
print("Don't move.")
def on_exit_red(self):
print("Go ahead!")
Run a transition
sm2 = TrafficLightIsolatedTransitions()
sm2.send("cycle")
'Running cycle from green to yellow'