一种简单易用的有限状态机

amtfsm的Python项目详细描述


amtfsm-一个简单的fsm

这个库旨在提供一个易于使用的有限状态机。

课程

状态类型

此类定义状态的支持类型:

  • fsm_begin_state:用于定义fsm的起点
  • fsm_normal_state:用于定义fsm的正常状态
  • fsm_end_state:用于定义fsm的端点

状态

这个类定义了一个fsm状态。与状态关联的属性是:

  • 名称:此状态的唯一标识符
  • 类型:由state type类定义的此状态的类型
  • 输入操作:输入此状态时发送给客户端的字符串
  • 退出操作:退出此状态时发送给客户端的字符串

事件

这个类定义了一个fsm事件。与事件关联的属性是:

  • 名称:此事件的唯一标识符

转换

转换根据当前状态和事件描述下一个状态。
与转换相关的属性是:

  • 事件:触发转换的事件
  • 开始状态:转换的初始状态
  • 结束状态:转换的结束状态

FSM

这个类定义了fsm。
以下属性可用:

  • 是否结束:如果fsm处于结束状态,则为true
  • 当前:FSM的当前状态

为了与客户正确沟通,FSM需要:

  • 接受参数的用户回调方法
  • 将在其中推送回调方法的用户队列

每当发生状态变化时,FSM将:

  • 使用先前状态的exit_操作推送队列中的回调
  • 使用新状态中的enter_操作推送队列中的回调

客户可用的方法

设置(用户回调、用户队列)

此函数用于启动用户回调和队列。
用户队列应该是queue.queue()
用户回调必须采用参数:

defuser_callback(fsm_action):# do something with fsm_action#...

fsmerror将在用户队列不可调用或用户队列不是queue.queue()的实例时引发。


添加(转换)

将转换列表添加到FSM。在分析此列表时,fsm将构建自己的状态和事件存储库。


state()

返回当前状态的名称,如果未定义当前状态,则返回""。


start()

在起点设置FSM。
has_ended将设置为

如果在状态列表中找不到起点,则将引发fsmerror


stop()

在终点设置fsm。
是否结束将设置为

如果在状态列表中找不到结束点,则将引发fsmerror


更新(事件)

用事件更新fsm。如果为当前状态定义了事件并且移动有效,则会发生转换。

fsmerror将在以下情况下引发:

  • 没有为当前状态定义事件
  • 结束状态为"无"

可以(状态)

如果fsm可以从当前状态移到状态,则返回true
否则返回false


无法(状态)

如果fsm无法从当前状态移到状态,则返回true
否则返回false


fsmbuilder

这个helper类用于从ayaml定义。
例子:

builder=FSMBuilder("myFSMDefinition.yml")fsm_composite=builder.parse()

成功解析yaml文件后,将创建一个fsmbuildercomposite对象。


fsmbuilder(文件名)
建造商。

如果在文件系统上找不到文件,将引发fsmbuildererror


分析(事件对象=真)

分析文件并构建fsmbuildercomposite对象。
如果event_objects为true,解析器将把每个事件映射到复合对象中的特定字符串。
字符串将以"e"开头,后跟索引。

示例:
事件按"播放"、"暂停"、"停止"的顺序在yaml文件中定义。
复合对象将具有以下属性:

  • 将映射到"播放"的e0
  • E1将映射到"暂停"
  • E2将映射到"停止"

fsmbuildererror将在以下情况下引发:

  • 如果yaml文件的版本不正确
  • 如果在文件中找不到特定标记(请参阅下面的yaml文件定义)

fsmbuildercomposite

此复合对象是在分析yaml文件时创建的。 创建后可用的属性是:

  • fsm:这是fsm对象
  • 事件:此列表包含在yaml定义中找到的所有事件
  • exxx:列表中事件的映射(可选)

例外情况

fsmerror

这是在FSM中发生问题时引发的一般异常。

fsmbuildererror

这是从yaml文件生成fsm时出现问题时引发的一般异常。

yaml文件定义

文件中应定义一组强制标记。

版本

这表示读取器解码此文件的最低版本。
目前,仅支持版本0.1.0

事件

为此FSM定义的事件列表

状态

为此FSM定义的状态列表。 为状态定义的属性是:

  • 名称(必需):此状态的唯一名称
  • 类型(可选):此状态的类型(开始、正常、结束)或默认为正常
  • 输入(可选):输入此状态时的操作字符串
  • 退出(可选):退出此状态时的操作字符串

转换

此FSM的转换列表。 每个转换应具有:

  • 事件(必需):事件中定义的事件名称
  • 开始(必需):开始状态的名称
  • 结束(必需):结束状态的名称

示例:

# define the versionVersion:0.1.0# define some eventsEvents:-E.PLAY-E.PAUSE-E.STOP# define some statesStates:-name:S.PLAYtype:BEGINenter:"play"exit:""-name:S.PAUSEtype:NORMALenter:"pause"-name:S.STOPtype:ENDenter:"stop"# define some transitionsTransitions:-event:E.PAUSEbegin:S.PLAYend:S.PAUSE-event:E.PAUSEbegin:S.PAUSEend:S.PAUSE-event:E.PLAYbegin:S.PAUSEend:S.PLAY-event:E.PLAYbegin:S.PLAYend:S.PLAY-event:E.STOPbegin:S.PLAYend:S.STOP-event:E.STOPbegin:S.PAUSEend:S.STOP-event:E.STOPbegin:S.STOPend:S.STOP

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

推荐PyPI第三方库


热门话题
使用Selenium Java查找筛选器窗格“铅笔图标”的元素时出现问题   分布式缓存l2上使用infinispan和hibernate的java连接锁   使用Java的DOM XML API解析XML中的符号和   java是解析和操作字符串的有效方法   java发布NewRelicMeterRegistry时如何过滤仪表   多维数组在java中读取文件后将数据值分组   java如何将httpClient配置为jsoup   java BreakIterator在Android中是如何工作的?   找不到maven GAE类:原因:java。lang.ClassNotFoundException应用程序标识cRedential$AppenginecRedential包装   Jlabel调整java大小   调试如何在VScode中的java类依赖项中设置断点   java正在获取文件夹名,而不是。mp3文件{Android}   java如何将从DiffieHellman类生成的AES密钥添加到使用该密钥的类