简单python有限自动机(有限状态机)实现

favink的Python项目详细描述


法文克

MaintainabilityCodeFactorBuild Status

在简单的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成员定义。

事件

Transition Life Cycle

进行转换将触发以下事件并调用相关的处理程序 (如果它们已经在类中实现):

  • 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...处理程序引发异常,则异常转换将中止。

汽车示例

Transition Life Cycle

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字典中的每个转换(键)动态定义方法。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JPanel自动调整大小   从Java更新MySQL数据库中的时间字段   在字符数组中读取字符串而不使用任何字符串函数,甚至java中的C++   java这段代码适合二叉树中的Euler教程吗?   如何在java中拆分字符串我的空行   爪哇舞厅舞者使用信号灯解决问题   java Android Studio MainActivity即使在新项目上也不存在   java Box2D:在矩形体的两端施加力,以实现2D无人机模拟。无法正确定位世界/本地点   python如何在Java中使用HTTP GET请求?   java如何使用ArrayList?   java为什么在缺少@Transactional时不抛出TransactionRequiredException?   java安卓活动可重用性   java Hibernate按属性获取记录不起作用   java如何在Android中使用SQLite多表触发带计数的连接查询?   java要读取的文本文件的正确文件路径   java使用JXL在Excel中切换网格线   java你能在没有外键的情况下用OneToOne关系链接两个实体吗?   java NotificationListenerService。cancelNotification引发NullPointerException   java我如何告诉Jersey客户端对其反序列化的每个类执行@JsonIgnoreProperties(ignoreUnknown=true)的等效操作?   循环特殊情况的java处理