Registry / workflow / python-statemachine

python-statemachine

JSON →
library3.0.0pypypi✓ verified 35d ago

Python Statemachine is an intuitive and powerful library for implementing finite state machines and statecharts. It offers a clean, pythonic, and declarative API for both synchronous and asynchronous Python codebases, supporting advanced features like compound states, parallel regions, history states, and dynamic diagram generation. The library maintains an active development pace with frequent updates and major releases introducing significant new capabilities.

workflow
Install & Compatibility
Where this runs
tested against v3.1.2 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
musl
py 3.103.940 runs
installs and imports cleanly · install 0.0s · import 0.287s · 20MB
glibc
py 3.103.940 runs
installs and imports cleanly · install 1.7s · import 0.251s · 21MB
18MB installed
● package 18MB
Code
Verified usage

Verified import paths — ran on the pinned version, not inferred.

Introduced in v3.0, recommended for new projects and statechart features.

from statemachine import StateChart, State

Main class in v2.x, preserved in v3.x for backward compatibility. Use StateChart for new features.

from statemachine import StateMachine, State

This quickstart defines a `TrafficLightMachine` as a `StateChart` with three states: `green`, `yellow`, and `red`. A `cycle` event transitions the light sequentially. It includes `before_cycle`, `on_enter_red`, and `on_exit_red` methods, which are automatically called during transitions and state entries/exits respectively.

from statemachine import StateChart, State class TrafficLightMachine(StateChart): "A traffic light machine" green = State(initial=True) yellow = State() red = State() cycle = ( green.to(yellow) | yellow.to(red) | red.to(green) ) def before_cycle(self, event: str, source: State, target: State): return f"Running {event} from {source.id} to {target.id}" def on_enter_red(self): print("Don't move.") def on_exit_red(self): print("Go ahead!") sm = TrafficLightMachine() print(f"Initial state: {sm.current_state.id}") print(sm.send("cycle")) print(f"Current state: {sm.current_state.id}") print(sm.send("cycle")) print(f"Current state: {sm.current_state.id}") print(sm.send("cycle")) print(f"Current state: {sm.current_state.id}")
Debug
Known footguns
breakingVersion 3.0.0 introduces `StateChart` as the new recommended base class for full statechart support (e.g., compound states, parallel regions, history states) and modern defaults. While the older `StateMachine` class is preserved, it maintains 2.x defaults and may not expose all new features. New projects should prefer `StateChart`.
breakingIn version 2.0.0, the `StateMachine.run()` method was removed in favor of `StateMachine.send()` for triggering events. Additionally, the default event processing model changed to 'Run-to-completion (RTC)', which affects how nested events are handled.
breakingVersion 2.0.0 removed `State.identification`, replacing it with `State.id`. State names also became optional, automatically deriving from the class variable name by default.
gotchaDiagram generation (using `python-statemachine[diagrams]`) requires the external `Graphviz` command-line tool (`dot`) to be installed on your system, in addition to the Python `pydot` dependency.
deprecatedFrom version 2.2.0, the library warns if non-final states do not have outgoing transitions, indicating potential 'trapped' states. This check is currently a warning but will become an exception by default (`strict_states=True`) in the next major release.
Upgrade
Version history

Breaking-change detection hasn't run for this library yet.

Audit
Security & dependencies

CVE tracking and dependency tree are planned for a later release.

Agent activity
22 hits · last 30 days
gptbot
4
ahrefsbot
4
perplexity-user
2
dotbot
1
script
1
bytedance
1
oai-searchbot
1
Resources