Python,yaml嵌套对象

jpe*_*ira 3 python yaml pyyaml deserialization

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

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

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

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

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

我这里有两个问题:

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

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

提前致谢

pyl*_*ver 6

让我们尝试对象的真正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)
Run Code Online (Sandbox Code Playgroud)

获取:

p1
p2
['p1', 'p2']
Run Code Online (Sandbox Code Playgroud)

永远不要在模块的根块中尝试yaml.load(),总是if __name__ == '__main__'在一个函数中使用或调用它,确保它将被调用一次.

请注意yaml声明:

!!python/object:myyaml.State { name: p1 },
Run Code Online (Sandbox Code Playgroud)

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