Super State Machine为您提供构建有限状态机的实用工具。
项目描述
Super State Machine为您提供构建有限状态机的实用工具。
自由软件:BSD许可证
功能
经过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 查看哈希值)
构建发行版
关闭
哈希值 for super_state_machine-2.0.2-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6f615d55970be4ab57f5121a15b60568145effa49e9316a2eaaf51b0b81f3456 |
|
MD5 | f0e60be7403d98115646b818628fadbe |
|
BLAKE2b-256 | 5ac00d5a60657096284b81b70f9a8e3a75de7e433f45b3c5ad17fbd312f15f59 |