Skip to content

pgularski/pysm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pysm - Python State Machine

Versatile and flexible Python State Machine library.

image

image

image

Code Health

Documentation Status

Implement simple and complex state machines ------------------------------------------

It can do simple things like this:

image

Or somewhat more complex like that:

image

Python State Machine

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 <https://en.wikipedia.org/wiki/UML_state_machine #Hierarchically_nested_states>, PDA and other tasty things.

Goals

  • 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

Features

  • 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

Installation

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

Documentation

Read the docs for API documentation and examples - http://pysm.readthedocs.io/

See Unit Tests to see it working and extensively tested.

Micropython support

The library works with pyboards!:

import upip
upip.install('upysm')

Links