我正在嘗試使用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