State Machines in Python

MRAB python at mrabarnett.plus.com
Sat Sep 4 20:13:28 CEST 2010


On 04/09/2010 18:58, Roy Smith wrote:
> In article<mailman.443.1283608243.29448.python-list at python.org>,
>   "D'Arcy J.M. Cain"<darcy at druid.net>  wrote:
>
>> On Sat, 4 Sep 2010 14:36:38 +0100
>> Jack Keegan<whatsjacksemail at gmail.com>  wrote:
>>> Just joined the group. I'm new to Python but been picking it up pretty easy.
>>
>> Welcome aboard.
>>
>>> As there is no switch statement in Python, I've been looking around for a
>>> good implementation. Most of the algorithms I've come across seem to be
>>
>> There's no switch statement because there's no real need for one.
>> Check out the following sample code and see if it gives you some ideas.
>>
>> #! /usr/bin/env python
>> # -*- coding: utf-8 -*-
>>
>> # Sample state machine
>>
>> import sys
>>
>> data = dict(counter = 0, flag = False)
>>
>> def state1(d):
>>      d['counter'] += 1
>>      print "In state 1, counter = %(counter)d" % d
>>      if d['flag']: sys.exit(0)
>>      return state2
>>
>> def state2(d):
>>      d['counter'] += 1
>>      print "In state 2, counter = %(counter)d" % d
>>      return state3
>>
>> def state3(d):
>>      d['counter'] += 1
>>      d['flag'] = True
>>      print "In state 3, counter = %(counter)d" % d
>>      return state1
>>
>> state = state1
>> while True:
>>      state = state(data)
>
> This is the pattern I've always used.  Simple and effective for any
> state machine which is small enough to code by hand.  I generally have
> my state methods return (next_state, output) tuples, but that's a detail.

I suppose that if they are that similar then you could generate the
code from a list or table of the states.



More information about the Python-list mailing list