Versatile and flexible Python State Machine library.
It can do simple things like this:
Or somewhat more complex like that:
The State Pattern solves many problems, untangles the code and saves one's sanity. Yet.., it's a bit rigid and doesn't scale. The goal of this library is to give you a close to the State Pattern simplicity with much more flexibility. And, if needed, the full state machine functionality, including FSM, HSM, PDA and other tasty things.
- Provide a State Pattern-like behavior with more flexibility (see Documentation for examples)
- Be explicit and don't add any magic code to objects that use pysm
- Handle directly any kind of event or input (not only strings) - parsing strings is cool again!
- Keep it simple, even for someone who's not very familiar with the FSM terminology
- Finite State Machine (FSM)
- Hierarchical State Machine (HSM) with Internal/External/Local transitions
- Pushdown Automaton (PDA)
- Transition callbacks - action, before, after
- State hooks - enter, exit, and other event handlers
- Entry and exit actions are associated with states, not transitions
- Events may be anything as long as they're hashable
- States history and transition to previous states
- Conditional transitions (if/elif/else-like logic)
- Explicit behaviour (no method or attribute is added to the object containing a state machine)
- No need to extend a class with State Machine class (composition over inheritance)
- Fast (even with hundreds of transition rules)
- Not too many pythonisms, so that it's easily portable to other languages (ie. JavaScript).
- Micropython support
Install pysm from PyPI:
pip install pysm
or clone the Github pysm repository:
git clone https://github.com/pgularski/pysm cd pysm python setup.py install
Read the docs for API documentation and examples - http://pysm.readthedocs.io/
See Unit Tests to see it working and extensively tested.
The library works with pyboards!:
import upip upip.install('upysm')