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上定义的任何转换也将被考虑。例如,如果一架飞机的燃料越来越少,它可能会进入紧急状态。这样的紧急过渡对于所有的空中状态都是有趣的。