Ich bin versucht, eine Zustandsmaschine zu implementieren, mit dem transitions Modul zu verwalten. Python Version 2.7.13 und Übergänge ist Version 0.4.4.Wie Zustandsübergänge in Python FSM mit Übergängen Bibliothek
In dem Projekt docs, die Beispiele all vorher durch die Zustände durch die Funktion der Eingabe fordert die Eingabeaufforderung. Einen Ausschnitt aus dem ersten Beispiel in den Übergängen docs, wird der Zustand der batman
erreicht, indem dem Namen Aufruf von Funktionen wake_up
und work_out
>>> batman.wake_up()
>>> batman.work_out()
>>> batman.state
'hungry'
Ich möchte die Zustandsmaschine automatisch vorrücken durch auf Modelldaten konditionierten Zustand. Das Spielzeugbeispiel unten ist das, was ich versuche zu tun, beruht aber auf der Verwendung einer Dummy-Funktion als Zeiger, um die next_state
einzustellen.
Gibt es eine Möglichkeit, dies zu tun, ist nicht mit einer next_state
Funktion erstellen und wie ein Zeiger verwendet? Die Übergangsdokumente haben einen geordneten Übergang und bedingte Übergänge. Aber was ich wirklich will, ist bedingte geordnete Übergänge.
Ist es möglich, den Code neu zu schreiben, ohne einen Funktionszeiger zu verwenden?
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()
Vielen Dank!
Was ist falsch mit Funktionszeigern? –
Im Allgemeinen nichts. Die Transitions-Bibliothek scheint so nett zu sein, dass die Verwendung von Zeigern im Vergleich zu den Beispielen ein ungeschicktes Verhalten war. Wenn ich das in C machen würde, wären Funktionszeiger völlig natürlich. – Matt