Я пытаюсь реализовать конечный автомат с использованием модуля 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