如何在YAML配置fi中存储pytransitions计算机

2024-10-03 09:13:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

许多用户将机器的配置存储为YAML文件,可以在@wtgee和{}here和{a3}的回复中看到。 在

现在我可以看到如何创建一个YAML文件来存储到states和transitions。但是,我不确定如何在YAML文件中存储与FSM相关的函数。在

有人能告诉我怎么做吗? 在


Tags: 文件函数用户机器yamlherea3状态机
1条回答
网友
1楼 · 发布于 2024-10-03 09:13:54

我不知道在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"}
  ]
}

或山药:

^{pr2}$

当您将回调存储为字符串时,将立即对它们求值,并触发事件(在本例中是go)。假设我们已经将上面的JSON/YAML加载到名为d的Python字典中。当dict键与transitions关键字相同时,可以如下初始化模型:

^{3}$

您可以在YAML中添加一个描述字段model,它指定要加载哪个模型类(例如'模块.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提出了更复杂的解决方案。他的文章包括以下方法:a)将FSM导出到JSON(Machine->;JSON);b)从JSON生成Python FSM代码;c)将FSM从JSON注入到一个类中。所有这些都应该很容易转移到YAML。在

相关问题 更多 >