Revision 3 as of 2005-10-10 06:32:21

Clear message

This is a summary of FSM implementations in Python right now.

For general information about finite state machines, see:


[ Finite State Machine Editor]

This is a tool where you can draw FSM diagrams, and then compile to a Python module (or C++ code.) It also makes an XML description of the FSM.

Requires QT for the editor. (Not the compiler, though, which probably reads XML.)

* [ tutorial] * [ project wiki]

[ FSA - Finite State Automation in Python]

This seems to be all about making FSMs, but I don't see a whole lot on how to use them!

[ Noah Spurrier's FSM]

This is one found on ActiveState; It's purely Python code. You init an FSM, register transitions, and then throw inputs at it. States and inputs must be hashable.

You can also [ find it on his website.]

[ fsmpy module]

This seems to be a Python wrapper around [ AT&T's FSM library.] It's all oriented around "weighted" finite state machines, so I'm not so sure how suitable it is if you just want to use unweighted FSM.

SkipMontanaro's FSM

[ From an e-mail.]

Features transition actions.

I've re-interpreted the code, adding formatting lost in e-mail, and PythonStyle-itizing it a bit.

   1 """Finite state machine, featuring transition actions."""
   3 FSMError = 'Invalid input to finite state machine'
   5 class FSM:
   7     """Finite state machine, featuring transition actions.
   9     The class stores a dictionary of (state, input) keys,
  10     and (state, action) values.
  12     When a (state, input) search is performed:
  13     * an exact match is checked first,
  14     * (state, None) is checked next.
  16     The action is of the following form:
  17     * function(current_state, input)
  18     """
  20     def __init__(self):
  21         self.states = {}
  22         self.state = None
  23         self.dbg = None
  25     def add(self, state, input, newstate, action):
  26         """Add a transition to the FSM."""
  27         self.states[(state, input)] = (newstate, action)
  29     def execute(self, input):
  30         """Perform a transition and execute action."""
  31         si = (self.state, input)
  32         sn = (self.state, None)
  33         # exact state match?
  34         if self.states.has_key(si):
  35             newstate, action = self.states[si]
  36         # no, how about a None (catch-all) match?
  37         elif self.states.has_key(sn):
  38             newstate, action = self.states[sn]
  39         if self.dbg != None:
  40             self.dbg.write('State: %s / Input: %s /'
  41                            'Next State: %s / Action: %s\n' %
  42                            (self.state, input, newstate, action))
  43         apply(action, (self.state, input))
  44         self.state = newstate
  46     def start(self, state):
  47         """Define the start state.
  49         Actually, this just resets the current state.
  50         """
  51         self.state = state
  53     def debug(self, out):
  54         """Assign a writable file to log transitions."""
  55         self.dbg = out

The Best monitor Directory on the Web

Monitor Directory has delivered to the market scores of standard and custom products and software solutions.

Unable to edit the page? See the FrontPage for instructions.