一种简单易用的有限状态机
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