python的灵活状态机

flexsm的Python项目详细描述


安装

pip install flexsm

您可以使用pip轻松安装flexsm:

导入、创建状态和状态机

创建状态和状态机非常简单:

fromflexsmimport*root=State("root")state1=State("state 1")state2=State("state 2")sm=StateMachine(root)

转换和输入变量

转换负责从一个状态转换到另一个状态。它们通常开始于一种状态,结束于另一种状态。如果下一个状态仅在运行时已知,例如,如果它依赖于输入变量“x”,则可以重写转换方法getnextstate

@addTransition(state=root)classWaitForSomeValueToBecomeSmall(Transition):defgetNextState(self,x):ifx>15:returnstate2else:returnstate1

如果x小于15,这段代码允许我们从状态root转换到state 1,例如通过调用:

sm.update("x",10)

如果x大于等于15,则返回state 2

还有一个输入变量time_in_state,它包含以秒为单位的当前状态的时间量。time_状态的最小保证分辨率为0.1秒,可以在statemachine构造中更改:

sm=StateMachine(root,time_resolution=0.01)

通过重写check方法,我们可以在状态为5秒或更长的情况下进行转换:

@addTransition(state=state1,next=state2)classWaitAMoment(Transition):defcheck(self,time_in_state,x):returntime_in_state>5defonTrigger(self,time_in_state,x):print("""We are in this boring
            state since {:.2f} seconds,
            with x being {}""".format(time_in_state,x))

我们还重写ontrigger,它在触发转换时调用。注意ontrigger和check的参数是如何相等的。所有转换方法的参数都是名称敏感的。因此,如果运行sm.update(“x”,100),就不能简单地使用参数y而不是x,并期望y为100。对于相同的转换,getnextstate、check和ontrigger的参数甚至必须相等!

仅当其中一个参数的值更改时,才会调用transition.check。因此,如果check方法中的代码花费了大量时间,请尽量避免频繁更改参数,如time_in_state。

父状态

考虑以下示例:

airbourne=State("Airbourne")doing360spin=State("Spin 360",parent=airbourne)sm=StateMachine(doing360spin)

在这种情况下,我们不仅处于doing360spin状态,而且还处于airbourne状态。因此,在airbourne上定义的任何转换也将被考虑。例如,如果一架飞机的燃料越来越少,它可能会进入紧急状态。这样的紧急过渡对于所有的空中状态都是有趣的。

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

推荐PyPI第三方库


热门话题
java Intellij通过方法中的包查找用法   java中VS代码和打包命名的问题   将java CMS功能集成到具有高度动态内容的网站(Lucene/Mysql/Nosql)的策略   oracle的java类强制转换异常。jdbc。驾驶员OracleConnection   字节码向JVM添加上指令   如何在抽象类中执行java方法?   java是否可以在apache访问日志中排除指定的GET参数?(作者:W7开发环境)   java如何获取已安装音频播放器的列表?   尝试向HS学生展示如何使用Java访问MS数据库   使用正则表达式java对给定行中的特定字符串进行计数   java JOOQ Select查询中的Select计数   方法Java,如何从二维双精度数组中找到特定值?   获取图像URL的java正则表达式   java在切换到新的窗口驱动程序后找不到元素