2017-12-09 17 views
0

私はpytranstionsライブラリを使用して有限状態マシンを構築しています。 @wtgee@limdautoherehereによって回答に見られるようにPytransitionsマシンをYAML設定ファイルに保存する方法

多くのユーザーは、YAMLファイルとして、マシンの設定を格納しています。

これで、状態とトランジションに格納するためにYAMLファイルを作成する方法を確認できます。しかし、どのようにしてFSMに関連する機能をYAMLファイルに格納するかについてはわかりません。

誰かに私にそのことを教えてもらえますか?

答えて

0

私は、実際のモデルとその機能を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に簡単に譲渡することができます。

関連する問題