【问题标题】:How to store a pytransitions machine in a YAML config file如何将 pytransitions 机器存储在 YAML 配置文件中
【发布时间】:2017-12-09 20:23:45
【问题描述】:

我正在使用pytranstions 库来构建有限状态机。

如@wtgee 和@limdautohere 和here 的回复中所示,许多用户将机器的配置存储为YAML 文件。

现在我可以看到如何创建 YAML 文件来存储状态和转换。但是,我不确定如何将与 FSM 关联的函数存储在 YAML 文件中。

有人能告诉我怎么做吗?

【问题讨论】:

    标签: python yaml transitions


    【解决方案1】:

    我不知道在 YAML/JSON 中存储实际模型及其功能的便捷方法。我假设您提到的工作流程只是将函数名称存储在 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:

    --- 
    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 字典中。当 dict 键与 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 中添加描述字段 model,以指定要加载的模型类(例如“module.models.TestModel”)并使用 importlib 导入模型定义 dynamically。或者您可以隐式定义所需的模型(例如,REST 端点“/TestModel”初始化一个 TestModel)。 如果您真的想将模型类定义存储在 YAML 中,您可以使用 pickle/dill 序列化类定义:

    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) 将 FSM 导出为 JSON(机器 -> JSON),b) 从 JSON 生成 Python FSM 代码,以及 c) 将 FSM 从 JSON 注入到类中。所有这些都应该很容易转移到 YAML。

    【讨论】:

    • 知道如何在每个状态的输出中编码吗?例如,在状态 A,LED1 = on,状态 B,LED2 = on,等等
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多