Skip to main content

Pythonic FSM

Project description

Finite State Machine [ FSM ]

A simple 'pythonic' FSM implementation. Decorate your actions with state transition. Create an instance of an FSM using state transition table. Push events into event queue. Process state machine using next generator.

State Transition Table

Decorate your actions with state transitions. Let's say you have a simple two state machine and one event that can between both states.

import fsm

table = fsm.Table()

@table('STATE1', 'doit', 'STATE2')
def action1(*args, **kwargs):
    pass

@table('STATE2', 'doit', 'STATE1')
def action2(*args, **kwargs):
    pass

print(table.dump())

OUTPUT

STATE1 --doit--> STATE2
STATE2 --doit--> STATE1

FSM Instance

Define an instance of your FSM using the state transition table and an initial state. To execute your state machine, you push events to your event queue and process via the next method.

myfsm = fsm.FSM(table, 'STATE1')

myfsm.push('doit')
myfsm.push('doit')

for _ in myfsm.next():
    print(myfsm.state)

OUTPUT

STATE2
STATE1

Since next is a generator, you will need to process via generator syntax. Doing it this way permits events to be pushed at any point into the FSM.

Actions

The action fn is called for each state transition. Sometimes you'll want to pass annotated data through the FSM. The next method provides that with *args, **kwargs. You may push an event with custom **kwargs data which will be merged into the action call **kwargs. Finally, every action called will have an transition_FSM passed in as kwargs as well.

Async

Use fsm.AsyncFSM to drive coroutine actions. It behaves exactly like fsm.FSM, except next is an async generator that awaits each action, so you process it with async for.

import asyncio
import fsm

table = fsm.Table()

@table('STATE1', 'doit', 'STATE2')
async def action1(*args, **kwargs):
    pass

@table('STATE2', 'doit', 'STATE1')
async def action2(*args, **kwargs):
    pass

async def main():
    myfsm = fsm.AsyncFSM(table, 'STATE1')
    myfsm.push('doit')
    myfsm.push('doit')
    async for _ in myfsm.next():
        print(myfsm.state)

asyncio.run(main())

OUTPUT

STATE2
STATE1

Actions may be either coroutines or plain functions — AsyncFSM awaits any awaitable result and uses the rest as-is, so you can freely mix sync and async actions in the same table.

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

simple_fsm-0.1.0.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

simple_fsm-0.1.0-py3-none-any.whl (4.4 kB view details)

Uploaded Python 3

File details

Details for the file simple_fsm-0.1.0.tar.gz.

File metadata

  • Download URL: simple_fsm-0.1.0.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for simple_fsm-0.1.0.tar.gz
Algorithm Hash digest
SHA256 811094d4838f17dde5aaeb0a4a3347cbb5e1ab5ee23dc5d42c39c611c0957194
MD5 6d7fa0268b67f6847e13553674a997cc
BLAKE2b-256 392bca6b46d32f964d71eb46b5d8f2cc790079944a06a59d8174f86e42aaf220

See more details on using hashes here.

File details

Details for the file simple_fsm-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: simple_fsm-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 4.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for simple_fsm-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e04ac902fa5775e274dcdcb40ff65e02bd0f76125581579f4fba7d27aab38224
MD5 4ed2c57e63ea1a11cd563c6bc390a739
BLAKE2b-256 86a5835340df786a6ec6b7afe7498ee3ffd839a8f9323c413d9b05b77a8bf502

See more details on using hashes here.

Supported by

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