2024-10-03 09:13:54 发布
网友
在 我使用pytranstions库来构建有限状态机。在
许多用户将机器的配置存储为YAML文件,可以在@wtgee和{}here和{a3}的回复中看到。 在
@wtgee
现在我可以看到如何创建一个YAML文件来存储到states和transitions。但是,我不确定如何在YAML文件中存储与FSM相关的函数。在
有人能告诉我怎么做吗? 在
我不知道在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"} ] }
或山药:
当您将回调存储为字符串时,将立即对它们求值,并触发事件(在本例中是go)。假设我们已经将上面的JSON/YAML加载到名为d的Python字典中。当dict键与transitions关键字相同时,可以如下初始化模型:
go
d
transitions
您可以在YAML中添加一个描述字段model,它指定要加载哪个模型类(例如'模块.models.TestModel'并使用importlib导入模型定义dynamically。或者您可以隐式地定义所需的模型(例如,REST端点'/TestModel'初始化一个TestModel)。 如果您真的想在YAML中存储模型类定义,可以使用pickle/dill序列化类定义:
model
importlib
d["model"] = pickle.dumps(Model) SerialisedModel = pickle.loads(d.pop("model")) model = SerialisedModel() m = Machine(model, **d)
如果只想存储当前状态,可以直接序列化Machine实例:
Machine
d["machine_object"] = pickle.dumps(m)
不过,这远不如之前的方法透明。 在任何情况下,您都应该避免使用函数引用定义回调,因为这可能会导致以后出现问题。也许泡菜/莳萝也能处理这个问题,但我不会指望它。在
Dave Kuhlmann提出了更复杂的解决方案。他的文章包括以下方法:a)将FSM导出到JSON(Machine->;JSON);b)从JSON生成Python FSM代码;c)将FSM从JSON注入到一个类中。所有这些都应该很容易转移到YAML。在
我不知道在YAML/JSON中存储实际模型及其函数的便捷方法。我假设您提到的工作流只是将函数名存储在JSON中,如下所示:
或山药:
^{pr2}$当您将回调存储为字符串时,将立即对它们求值,并触发事件(在本例中是
^{3}$go
)。假设我们已经将上面的JSON/YAML加载到名为d
的Python字典中。当dict键与transitions
关键字相同时,可以如下初始化模型:您可以在YAML中添加一个描述字段
model
,它指定要加载哪个模型类(例如'模块.models.TestModel'并使用importlib
导入模型定义dynamically。或者您可以隐式地定义所需的模型(例如,REST端点'/TestModel'初始化一个TestModel)。 如果您真的想在YAML中存储模型类定义,可以使用pickle/dill序列化类定义:如果只想存储当前状态,可以直接序列化
Machine
实例:不过,这远不如之前的方法透明。 在任何情况下,您都应该避免使用函数引用定义回调,因为这可能会导致以后出现问题。也许泡菜/莳萝也能处理这个问题,但我不会指望它。在
Dave Kuhlmann提出了更复杂的解决方案。他的文章包括以下方法:a)将FSM导出到JSON(Machine->;JSON);b)从JSON生成Python FSM代码;c)将FSM从JSON注入到一个类中。所有这些都应该很容易转移到YAML。在
相关问题 更多 >
编程相关推荐