简单python有限自动机(有限状态机)实现
favink的Python项目详细描述
法文克
在简单的python有限自动机(有限状态机)实现上
开始
要安装favink,请使用pypi存储库中的包:
pip install favink
要将有限自动机特性添加到代码中的类中,必须继承 finiteAutomata类并定义以下成员:
- 转换表
transitions
- 初始状态
init_state
- 事件处理程序方法。
对于每个转换,构造函数都创建一个带有参数掩码的动态方法
(self, *args, **kwargs)
。每个方法都以转换命名。
要进行转换,您应该调用转换方法。方法之后
已调用它更改实例状态并调用相关的事件处理程序。
如果当前状态不允许调用转换InvalidTransition
将提高扩展名。
转换表和初始状态
transitions
是一个字典,其中键是转换名,
值定义允许和目标状态:
transitions={"transition_1":["allowed_state_1","target_state_1"],"transition_2":[["allowed_state_2","allowed_state_3"],"target_state_2"]}
初始状态由init_state
成员定义。
事件
进行转换将触发以下事件并调用相关的处理程序 (如果它们已经在类中实现):
after
before
on
事件处理程序定义
对于每个状态(例如state_name
),可以定义以下方法:
defbefore_state_name(self,transition_detail):...defon_state_name(self,transition_detail,origin_state):...defafter_state_name(self,transition_detail):...
转换细节是一个三项元组(name, args, kwargs)
,其中
name
是转换名;args
是一个包含传递给转换调用的位置参数的列表,kwargs
是一个字典,它向转换调用传递关键字参数,
如果after_...
或before...
处理程序引发异常,则异常转换将中止。
汽车示例
classCar(FiniteAutomata):init_state="stopped"transitions={"start_engine":["stopped","idle"],"stop_engine":["idle","stopped"],"forward":["idle","moving_forward"],"backward":["idle","moving_backward"],"stop":[["moving_forward","moving_backward"],"idle"],}defon_stopped(self,transition,origin):print("Engine has been stopped")defon_idle(self,transition,origin):print("I'm not moving, but engine is on")defon_moving_forward(self,transition,origin):print("Let's go!")defon_moving_backward(self,transition,origin):print("Why are we retreating?")car=Car()car.start_engine()car.forward()car.stop()car.backward()car.stop()car.stop_engine()
输出:
I'm not moving, but engine is on Let's go! I'm not moving, but engine is on Why are we retreating? I'm not moving, but engine is on Engine has been stopped
API参考
预定义的FiniteAutomata
方法
FiniteAutomata.get_state(self)
以字符串形式返回当前实例状态名。
FiniteAutomata.get_allowed_transitions(self)
返回包含当前实例状态允许的所有事务的列表。
FiniteAutomata.is_allowed(self, transition)
过渡方法
为transitions
字典中的每个转换(键)动态定义方法。