gpt4 book ai didi

python - 如何在 YAML 配置文件中存储 pytransitions 机器

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:21 25 4
gpt4 key购买 nike

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

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

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

有人可以告诉我该怎么做吗?

最佳答案

我不知道在 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 字典中。当字典键与 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”)并导入模型定义 dynamically使用importlib。或者您可以隐式定义所需的模型(例如,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 注入(inject)到类中。所有这些都应该可以轻松转移到 YAML。

关于python - 如何在 YAML 配置文件中存储 pytransitions 机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com