跳转到主要内容

Super State Machine为您提供构建有限状态机的实用工具。

项目描述

https://badge.fury.io/py/super_state_machine.png https://travis-ci.org/beregond/super_state_machine.png?branch=master https://pypip.in/d/super_state_machine/badge.png

Super State Machine为您提供构建有限状态机的实用工具。

功能

  • 经过Python 2.7、3.3、3.4和PyPy的全面测试。

  • 创建有限状态机

    >>> from enum import Enum
    
    >>> from super_state_machine import machines
    
    
    >>> class Task(machines.StateMachine):
    ...
    ...    state = 'draft'
    ...
    ...    class States(Enum):
    ...
    ...         DRAFT = 'draft'
    ...         SCHEDULED = 'scheduled'
    ...         PROCESSING = 'processing'
    ...         SENT = 'sent'
    ...         FAILED = 'failed'
    
    >>> task = Task()
    >>> task.is_draft
    False
    >>> task.set_draft()
    >>> task.state
    'draft'
    >>> task.state = 'scheduled'
    >>> task.is_scheduled
    True
    >>> task.state = 'process'
    >>> task.state
    'processing'
    >>> task.state = 'wrong'
    *** ValueError: Unrecognized value ('wrong').
  • 定义允许的转换图,定义额外的命名转换和检查器

    >>> class Task(machines.StateMachine):
    ...
    ...     class States(Enum):
    ...
    ...         DRAFT = 'draft'
    ...         SCHEDULED = 'scheduled'
    ...         PROCESSING = 'processing'
    ...         SENT = 'sent'
    ...         FAILED = 'failed'
    ...
    ...     class Meta:
    ...
    ...         allow_empty = False
    ...         initial_state = 'draft'
    ...         transitions = {
    ...             'draft': ['scheduled', 'failed'],
    ...             'scheduled': ['failed'],
    ...             'processing': ['sent', 'failed']
    ...         }
    ...         named_transitions = [
    ...             ('process', 'processing', ['scheduled']),
    ...             ('fail', 'failed')
    ...         ]
    ...         named_checkers = [
    ...             ('can_be_processed', 'processing'),
    ...         ]
    
    >>> task = Task()
    >>> task.state
    'draft'
    >>> task.process()
    *** TransitionError: Cannot transit from 'draft' to 'processing'.
    >>> task.set_scheduled()
    >>> task.can_be_processed
    True
    >>> task.process()
    >>> task.state
    'processing'
    >>> task.fail()
    >>> task.state
    'failed'

    注意,第三个参数限制从哪些状态添加转换到允许的(在process的情况下,新的允许转换将添加,从‘scheduled’到‘processing’)。没有参数表示所有可用的状态,None或空列表不会添加除定义之外的内容。

  • 将状态机用作属性

>>> from enum import Enum

>>> from super_state_machine import machines, extras


>>> class Lock(machine.StateMachine):

...     class States(Enum):
...
...         OPEN = 'open'
...         LOCKED = 'locked'
...
...     class Meta:
...
...         allow_empty = False
...         initial_state = 'locked'
...         named_transitions = [
...             ('open', 'open'),
...             ('lock', 'locked'),
...         ]


>>> class Safe(object):
...
...     lock1 = extras.PropertyMachine(Lock)
...     lock2 = extras.PropertyMachine(Lock)
...     lock3 = extras.PropertyMachine(Lock)
...
...     locks = ['lock1', 'lock2', 'lock3']
...
...     def is_locked(self):
...          locks = [getattr(self, lock).is_locked for lock in self.locks]
...          return any(locks)
...
...     def is_open(self):
...         locks = [getattr(self, lock).is_open for lock in self.locks]
...         return all(locks)

>>> safe = Safe()
>>> safe.lock1
'locked'
>>> safe.is_open
False
>>> safe.lock1.open()
>>> safe.lock1.is_open
True
>>> safe.lock1
'open'
>>> safe.is_open
False
>>> safe.lock2.open()
>>> safe.lock3 = 'open'
>>> safe.is_open
True

历史

2.0.2 (2017-03-13)

  • 修复了Python > 3.4的要求。

2.0.1 (2017-02-27)

  • 删除了Python > 3.4的enum34。

  • 增加了对Python 2.6的支持。

2.0 (2016-09-26)

  • 增加了force_set方法。

  • 增加了field machine。

  • 增加了对Python 3.5的支持。

向后兼容性中断

  • 现在不允许空状态。

  • 使用标量时,只允许完整名称,不允许缩写。

  • 删除了对不可哈希类型的支持。

1.0 (2014-09-04)

  • 增加了所有基本功能。

0.1.0 (2014-08-08)

  • PyPI上的首次发布。

  • 增加了创建简单状态机的实用工具。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

super_state_machine-2.0.2.tar.gz (24.4 kB 查看哈希值)

上传时间 源代码

构建发行版

super_state_machine-2.0.2-py2.py3-none-any.whl (10.3 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持