Skip to main content

Simple Finite-State Machines

Project description

pystatemachine

pystatemachine is a versatile, yet easy-to-use finite-state machine library written in python. It provides functions to turn any python object into a finite-state automaton which changes from one State to another when initiated by a triggering event.

Usage

A finite-state machine is defined by a list of its states, and the triggering condition for each transition. pystatemachine offers an event decorator for a classes’ bound methods, a State class to define the finite-state machine’s states, and a acts_as_state_machine decorator for turning any python (new- or old-style) class into a finite-state machine. By default, any event-decorated method may raise errors. Optionally, a transition_failure_handler decorator turns any class method into a failure handler which gets invoked when an event-decorated method raises an error.

Example

Following, a turnstile is modeled.

An example of a very simple mechanism that can be modeled by a state machine is a turnstile. A turnstile is a gate with three rotating arms at waist height, one across the entryway. Initially the arms are locked, barring the entry, preventing customers from passing through. Depositing a coin or token in a slot on the turnstile unlocks the arms, allowing a single customer to push through. After the customer passes through, the arms are locked again until another coin is inserted. - from [Wikipedia] (http://en.wikipedia.org/wiki/Finite-state_machine#Example:_a_turnstile)

@acts_as_state_machine
class Turnstile(object):
    locked = State('locked', initial=True)
    unlocked = State('unlocked')

    @event(from_states=(locked, unlocked), to_state=unlocked)
    def coin(self):
        assert random.random() > .5, 'failing for demonstration purposes, only ..'
        print('*blingbling* .. unlocked!')

    @event(from_states=(locked, unlocked), to_state=locked)
    def push(self):
        print('*push* .. locked!')

    @transition_failure_handler(calling_sequence=2)
    def turnstile_malfunction(self, method, from_state, to_state, error):
        print('state transition from {0.name} to {1.name} failed. Reason: {2}'.format(from_state, to_state, error))

    @transition_failure_handler(calling_sequence=1)
    def before_turnstile_malfunction(self, method, from_state, to_state, error):
        print('before state transition failure handler ..')


import random

turnstile = Turnstile()
for _ in range(10):
    handler = random.choice([turnstile.coin, turnstile.push])
    handler()

License

pystatemachine is available under MIT License.

Download

You can download pystatemachine.py.

Alternatively:

git clone git@github.com:cmaugg/pystatemachine

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pystatemachine-1.1.zip (9.2 kB view details)

Uploaded Source

File details

Details for the file pystatemachine-1.1.zip.

File metadata

  • Download URL: pystatemachine-1.1.zip
  • Upload date:
  • Size: 9.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pystatemachine-1.1.zip
Algorithm Hash digest
SHA256 6acb80acdbb0453680fc9c46e8f68fc251cbceae9adf19def8999513c70bfee1
MD5 290b4d7e61b59065744a9efcc9de8abf
BLAKE2b-256 a37542715f2542867e4d0778b034d5832b4136b893fb1dfcbe0fcbd3bd6242a5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page