概要
Pythonのパッケージである transitions
で状態遷移処理を実装する際のノウハウを、
サンプルソースを元に記載する。
サンプルソース
from transitions import Machine
# 状態の定義
states = ['A', 'B', 'C']
# 状態遷移の定義
transitions = {'trigger': 'fromAtoB', 'source': 'A', 'dest': 'B'}
# Modelインスタンスの生成
model = Model()
# Machineインスタンスの生成
machine = Machine(model=model, states=states, initial='A', auto_transisitons=False)
# Modelクラスの宣言
class Model(object):
# 状態Bに遷移した時の処理
def on_enter_B(self):
print('State transition to B')
サンプルソースに対する説明
状態の定義
states = ['A', 'B', 'C']
A状態、B状態、C状態を定義している。
状態遷移の定義
transitions = {'trigger': 'fromAtoB', 'source': 'A', 'dest': 'B'}
AからBへの状態遷移を定義している。
フィールド: trigger
状態遷移のトリガーを命名する。
fromAtoB()をコールすることにより、AからBへの状態遷移をトリガーできる。
フィールド: source
遷移前の状態を指定する。
ここではA状態が指定されているため、C状態にて fromAtoB()
がコールされたとしても、
C状態からB状態への遷移は行われない。
フィールド: dest
遷移後の状態を指定する。ここではB状態。
フィールド: conditions
遷移が発生するための条件を指定する。
指定された変数、リスト、関数の戻り値がTrueの場合のみ遷移が行われる。
フィールド: unless
遷移が発生しないための条件を指定する。
conditions
フィールドと逆に、 False
の場合のみの遷移が行われる。
フィールド: before
遷移が発生する前に実行されるコールバック関数を指定する。
フィールド: after
遷移が発生した後に実行されるコールバック関数を指定する。
Modelインスタンスの生成
model = Model()
class Model(object):
def on_enter_B(self):
print('State transition to B')
Machine
インスタンスの生成に使用するために、
Model
クラスを宣言してインスタンスを生成している。
on_enter_B()
状態Bへの遷移が発生した後に実行されるコールバック関数。
on_enter_[状態名]()
という関数を宣言することで、同様にコールバック関数を追加できる。
Machineインスタンスの生成
machine = Machine(model=model, states=states, initial='A', auto_transisitons=False)
状態遷移を実装するため、Machineインスタンスを生成している。
ここでは、状態遷移実装対象に model
, 状態に states
, 初期状態にA状態, auto_transitions
に False
が指定されている。
引数: model
型は任意のオブジェクトまたはオブジェクトのリスト。
状態遷移を実装する対象のオブジェクトを指定する。
引数: states
型は状態のリストまたは辞書。
状態遷移で使用する状態を指定する。
引数: transitions
型は状態のリストまたは辞書。
状態遷移を指定する。
引数: initial
型は文字列または state
オブジェクト。
初期状態を指定する。
引数: auto_transitions
型はブール値。
True
を指定すると、 to_[状態名]()
という形式のトリガーが追加される。
デフォルトでは True
。
引数: ordered_transitions
型はブール値またはリスト。
True
を指定すると、状態をリスト順に遷移させるための next_state()
が追加される。
引数: before_state_change
型は関数または関数のリスト。
すべての状態遷移が実行される前に呼び出されるコールバック関数を指定する。
引数: after_state_change
型は関数または関数のリスト。
すべての状態遷移が実行された後に呼び出されるコールバック関数を指定する。
引数: send_event
型はブール値。
True
に設定すると、トリガーが呼び出されたときにEventData
オブジェクトが関数に渡される。
このオブジェクトには、トリガー名、ソース状態、遷移先状態、model
などの情報が含まれる。
引数: prepare_event
型は関数または関数のリスト。
イベント処理の準備として、遷移が実行される前に呼び出されるコールバック関数を指定する。
引数: finalize_event
型は関数または関数のリスト。
イベント処理の完了として、遷移が実行された後に呼び出されるコールバック関数を指定する。
引数: ignore_invalid_triggers
無効なトリガーが呼び出された場合に、エラーを発生させずに無視するかどうかを指定する。
True
に設定すると、無効なトリガーはエラーを発生させず、無視される。