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