我正在尝试使用transitions模块实现状态机。 Python版本2.7.13和转换版本是0.4.4。如何使用转换库管理python fsm中的状态转换
在项目文档中,所有示例都通过在命令提示符处键入函数调用来完成状态。以从在转变文档的第一示例的片断,的batman
状态由调用名为功能wake_up
和work_out
>>> batman.wake_up()
>>> batman.work_out()
>>> batman.state
'hungry'
我想自动有所述状态机通过状态空调模型数据推进实现的。下面的玩具示例是我正在尝试做的,但依靠使用虚拟函数作为指针来设置next_state
。
有没有办法做到这一点,不涉及创建一个next_state
函数,并像指针一样使用它?转换文档有一个有序转换和条件转换但我真正想要的是有条件有序转换。
是否可以在不使用函数指针的情况下重写下面的代码?
from transitions import Machine
class AModel(object):
def __init__(self):
self.sv = 0 # state variable of the model
def on_enter_sA(self):
print "Entered sA"
self.next_state = self.to_sB
def on_enter_sB(self):
print "Entered sB"
if self.sv < 3:
self.next_state = self.to_sB
else:
self.next_state = self.to_sC
def on_enter_sC(self):
print "Entered sC"
if self.sv == 6:
self.next_state = self.to_sD
def on_enter_sD(self):
print "Entered sD"
self.next_state = self.to_sA
def next_state(self):
pass
#setup model and state machine
model = AModel()
#init transitions model
list_of_states = ['sA','sB','sC','sD']
transitions = [
{'trigger':'to_sA','source':'sD','dest':'sA'},
{'trigger':'to_sB','source':'sA','dest':'sB'},
{'trigger':'to_sC','source':'sB','dest':'sC'},
{'trigger':'to_sD','source':'sC','dest':'sD'}
]
machine = Machine(model=model, states=list_of_states, initial='sA',
transitions=transitions)
model.next_state = model.to_sB #init next state pointer
#begin main
for i in range(0,8):
print 'iter is: ' + str(i) + " -model state is:" + model.state
model.sv = i #update model state variable, local state logic
#will determine what next_state points to
model.next_state()
谢谢!
函数指针有什么问题? –
一般没有。转换库似乎非常好,与我的例子相比,使用指针的方式看起来很笨拙。如果我在C中这样做,函数指针将是完全自然的。 – Matt