【发布时间】:2017-02-16 21:09:39
【问题描述】:
我正在尝试使用transitions 模块实现状态机。 Python 版本 2.7.13 和转换是版本 0.4.4。
在项目文档中,所有示例都通过在命令提示符下键入函数调用来推进状态。以转换文档中第一个示例的 sn-p 为例,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 中这样做,函数指针将是完全自然的。
标签: python transitions fsm