私は、実際のモデルとその機能をYAML/JSONに保存する便利な方法について知らないです。
{
"states": ["A", "B", "C"],
"initial": "A",
"transitions": [
{"trigger": "go", "source": "A", "dest": "B", "after": "func_A"},
{"trigger": "go", "source": "B", "dest": "C", "after": "func_B"}
]
}
やYAML::私はあなたが言及したワークフローはちょうどこのようなJSONで関数名を格納することを前提とし
---
initial: A
states:
- A
- B
- C
transitions:
-
after: func_A
dest: B
source: A
trigger: go
-
after: func_B
dest: C
source: B
trigger: go
あなたは、彼らが瞬間を評価されます文字列としてコールバックを格納し、イベント(この場合はgo
)がトリガーされます。上記のJSON/YAMLをd
というPython辞書にロードしたとします。辞書のキーはtransitions
のキーワードに一致しているとき、あなたはこのようなモデルを初期化することができます
from transitions import Machine
class Model:
def func_A(self):
print("func A")
def func_B(self):
print("func B")
model = Model()
m = Machine(model, **d)
model.go()
model.go()
あなたは(どのモデルクラスをロードするように指定しますあなたのYAMLに例えば「module.models.TestModelを説明フィールドmodel
を追加することができます')、importlib
でモデル定義dynamicallyをインポートします。または、必要なモデルを暗黙的に定義できます(たとえば、RESTエンドポイント '/ TestModel'がTestModelを初期化します)。 あなたが本当にYAMLでモデルのクラス定義を保存したい場合は、ピクルス/ディルでクラス定義をシリアライズ可能性があります
d["model"] = pickle.dumps(Model)
SerialisedModel = pickle.loads(d.pop("model"))
model = SerialisedModel()
m = Machine(model, **d)
あなただけの現在の状態を保存したい場合は、あなたが直接あなたのMachine
インスタンスをシリアライズすることができます:
d["machine_object"] = pickle.dumps(m)
これは以前のアプローチよりも透明性が低いです。 いずれにしても、後で問題が発生する可能性があるため、関数参照でコールバックを定義することは避けてください。多分ピクル/ディルもこれを扱うことができますが、私はそれを期待しません。
より洗練された解決策が、Dave Kuhlmann hereによって提案されました。彼の投稿には、a)JSON(Machine - > JSON)へのFSMのエクスポート、b)JSONからのPython FSMコードの生成、およびc)JSONからのクラスへのFSMの注入というアプローチが含まれます。これらのすべては、YAMLに簡単に譲渡することができます。