Python、yaml嵌套对象

标签 python deserialization yaml pyyaml

我正在尝试创建一个 yaml 格式,允许我在另一个对象中创建一个对象。 在这个示例中,我试图创建一个状态机对象,同时用一些状态和它们之间的连接填充它。

yaml.load("""
!statemachine {
     states: [
       !state { name: p1 },
       !state { name: p2 },
       !state { name: p3 },],
     connections:
      [!connection { 'pim' : [p1,p2]}]}
""")

!statemachine 有一个生成 MyStateMachine 类型对象的构造函数

!state 有一个构造函数生成一个 MyState 类型的对象

!connection 有一个构造函数,它应该使用以名称 p1 生成的对象并向其添加连接

我这里有两个问题:

1 - state 的构造函数在创建 statemachine 并且其中不存在状态后调用

2 - 检索对象 p1 并在其上调用方法 add_connection。

提前致谢

最佳答案

让我们试试真正的 pyyaml对象语法

myyaml.py:

import yaml,sys

class StateMachine(object):
    pass

class State(object):
    pass

class Connection(object):
    pass

if __name__ == '__main__':
    o = yaml.load("""
    !!python/object:myyaml.StateMachine {
         states: [
           !!python/object:myyaml.State { name: p1 },
           !!python/object:myyaml.State { name: p2 },
           !!python/object:myyaml.State { name: p3 },],
         connections:
          [       !!python/object:myyaml.Connection { 'pim' : [p1,p2]}]}
    """)
    print o.states[0].name
    print o.states[1].name
    print o.connections[0].pim
    sys.exit(0)

获取:

p1
p2
['p1', 'p2']

永远不要在模块的根 block 中尝试 yaml.load(),始终使用 if __name__ == '__main__' 或在函数中调用它,确保它会被调用一次。

请注意yaml语句:

!!python/object:myyaml.State { name: p1 },

此时 yaml 尝试在另一个上下文中再次导入 myyaml.py,并且将执行模块根目录中的所有代码,如果您将 yaml.load 或类似的东西放在模块根目录中,您可能会遇到死循环,或者意想不到的结果。

关于Python、yaml嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17188306/

相关文章:

python - 不能在 python 类中使用 iadd

java - 使用 jackson 转换时 POJO 具有空值

python - YAML 不调用构造函数

xml - 将 Liquibase XML 转换为 YAML?

parsing - 是否有将位串转换为整数的 Julia 函数?

docker - 在 docker-compose.yml 中使用继承

python - Flask/Python/WTForms 验证和动态设置 SelectField 选择

python - Bootstrap 和 Flask : How to receive a POST?

javascript - ajax 请求 django , jquery

Java-rest 调用 : Population of value within variable should work for two variables name