超级状态机为您提供了构建有限状态机的实用程序。
super_state_machine的Python项目详细描述
超级状态机为您提供了构建有限状态机的实用程序。
- 免费软件:BSD许可证
- 文档:https://super_state_machine.readthedocs.org
- 来源:https://github.com/beregond/super_state_machine
功能
使用Python2.7、3.3、3.4和Pypy进行了全面测试。
创建有限状态机:
>>>fromenumimportEnum>>>fromsuper_state_machineimportmachines>>>classTask(machines.StateMachine):......state='draft'......classStates(Enum):......DRAFT='draft'...SCHEDULED='scheduled'...PROCESSING='processing'...SENT='sent'...FAILED='failed'>>>task=Task()>>>task.is_draftFalse>>>task.set_draft()>>>task.state'draft'>>>task.state='scheduled'>>>task.is_scheduledTrue>>>task.state='process'>>>task.state'processing'>>>task.state='wrong'***ValueError:Unrecognizedvalue('wrong').
定义允许的转换图,定义其他命名转换 跳棋:
>>>classTask(machines.StateMachine):......classStates(Enum):......DRAFT='draft'...SCHEDULED='scheduled'...PROCESSING='processing'...SENT='sent'...FAILED='failed'......classMeta:......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:Cannottransitfrom'draft'to'processing'.>>>task.set_scheduled()>>>task.can_be_processedTrue>>>task.process()>>>task.state'processing'>>>task.fail()>>>task.state'failed'
注意,第三个参数限制了从哪个状态转换为 已将添加到allowed(在process的情况下,新的allowed transition将是 已添加,从“计划”添加到“处理”)。无参数表示全部可用 状态、None或空列表将不会添加任何超出定义范围的内容。
使用状态机作为属性:
>>>fromenumimportEnum>>>fromsuper_state_machineimportmachines,extras>>>classLock(machine.StateMachine):...classStates(Enum):......OPEN='open'...LOCKED='locked'......classMeta:......allow_empty=False...initial_state='locked'...named_transitions=[...('open','open'),...('lock','locked'),...]>>>classSafe(object):......lock1=extras.PropertyMachine(Lock)...lock2=extras.PropertyMachine(Lock)...lock3=extras.PropertyMachine(Lock)......locks=['lock1','lock2','lock3']......defis_locked(self):...locks=[getattr(self,lock).is_lockedforlockinself.locks]...returnany(locks)......defis_open(self):...locks=[getattr(self,lock).is_openforlockinself.locks]...returnall(locks)>>>safe=Safe()>>>safe.lock1'locked'>>>safe.is_openFalse>>>safe.lock1.open()>>>safe.lock1.is_openTrue>>>safe.lock1'open'>>>safe.is_openFalse>>>safe.lock2.open()>>>safe.lock3='open'>>>safe.is_openTrue
历史记录
2.0.2(2017-03-13)
- 对python>;3.4的固定要求。
2.0.1(2017-02-27)
- 删除python的enum34>;3.4。
- 增加了对Python2.6的支持。
2.0(2016-09-26)
- 增加了力集方法。
- 添加了现场机器。
- 增加了对Python3.5的支持。
向后兼容性中断:
- 空状态现在是不允许的。
- 使用标量时,只允许使用全名,不允许使用快捷方式。
- 删除了对不可更改类型的支持。
1.0(2014-09-04)
- 添加了所有基本功能。
0.1.0(2014-08-08)
- pypi上的第一个版本。
- 添加了创建简单状态机的实用程序。