用于共同例程基态机的python包。

pystate的Python项目详细描述


finite state machine-一个使用协程的有限状态机类

finite state machine是一个表示有限状态机的类。每个状态都由
国家级。每个状态还定义了一个状态处理函数。handler函数是一个
排除一个事件并根据它执行一个操作。

要定义状态机:

1)定义状态(例如state_a=state('state_a'))
2)定义状态处理函数。有关状态处理函数的结构,请参见下文。
3)创建状态机的实例(例如,fsm=fsm())
4)将状态添加到状态机,包括恰好一个标记为初始状态的状态。每个州也采取
可以从(从)状态转换的状态序列。
5)调用fsm上的start函数(例如fsm.start())

对于每个事件,您需要调用dispatch_event函数(例如fsm.dispatch_event())来路由事件
转到co例程。事件可以是您想要的任何东西(例如,带有事件id和参数的元组)。主回路
通常看起来像:

尝试:
如果为真:
事件=获取下一个事件()
FSM.调度事件(事件) <除e为e外:
通过

状态处理程序的基本结构是:

定义状态处理程序状态名称(FSM):
输入co例程的主循环
如果为真:
事件=收益

如果event='事件1':
转换到另一个状态
FSM.转换到(状态x)
elif event='事件2':
进行一些处理,但保持此状态
print('got event_2')
elif event='终止事件': 提高FSM出口
其他:
打印('无法识别的事件(%s)'%事件)

一个简单的例子显示在turnstile_test.py测试用例中。

为了方便起见,可以使用@state_handler decorator包装。装潢师负责共同事务
为处理程序添加一个fsm和事件。这看起来像:

@pystate.state\u处理程序
def state_locked_处理程序(事件,fsm):
如果event='事件1':
转换到另一个状态
FSM.转换到(状态x)
elif event='事件2':
进行一些处理,但保持此状态
print('got event_2')
elif event='终止事件': 提高FSM出口
其他:
打印('无法识别的事件(%s)'%事件)

有两种方法可以处理需要保留持久数据的状态。您可以创建一个可调用的clas(即define
调用dunder方法作为状态处理程序)这允许您在
调用方法。或者,如果通过
但是,hand不允许使用decorator。有关示例,请参见callable_test.py测试用例。

作者:len wanger
上次更新时间:2016年7月7日
版权所有(c)2016 Len Wanger

特此免费向获得副本的任何人授予许可
本软件和相关文档文件(“软件”)的
在软件中不受限制,包括但不限于
使用、复制、修改、合并、发布、分发、再授权和/或出售
软件的副本,并允许软件的使用者
根据以下条件提供:

以上版权声明和本许可声明应包括在所有
软件的副本或大部分。

本软件按“原样”提供,无任何形式的保证,明示或
隐含的,包括但不限于适销性保证, 适合特定目的和不侵权的健身。在任何情况下
作者或版权所有者应对任何索赔、损害或其他
责任,无论是在合同诉讼、侵权诉讼还是其他诉讼中,由以下原因引起的,
不属于或与本软件有关,或与本软件的使用或其他交易有关。
软件。

注:实质性代码改编自Christian Maugg的pystatemachine代码
版权所有(c)2015 Christian Maugg
(https://raw.githubusercontent.com/cmaugg/pystatemachine/master/pystatemachine.py)

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

推荐PyPI第三方库


热门话题
Java中两个ArrayList的内部联接   java如何制作按钮侦听器组方法?   Java位表示法中的字节、字符和int   java如何测试控制台输出代码?   JAXB在编组java时将xmlns添加到元素中   java 安卓 Web服务调用问题   java从按钮中选择多个正确答案   java如何获取sensu服务器事件数据   java如何在编写时添加分隔符。使用openCSV的csv文件   在fedora 23上通过jnlp运行jenkins slave的java问题   如何从java web应用程序创建http可见文件?   java如何在安卓中通过编程改变矢量绘图的颜色   java为什么我总是得到未初始化的变量x?   无法从java/Android Studio中的网站获取数据   ArrayList实现在Java中的最低级别是如何工作的?   java告诉SAX解析器忽略无效字符?   java无法使用JarSplice创建可运行的LWJGL jar   java解析一个包含许多字段的json对象   用于Command+T的java JavaFX密钥组合(新选项卡)   java StreamAPI收集器。groupingBy空集合而不是null