Python、yaml嵌套对象

2024-05-17 02:36:47 发布

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

我正在尝试创建一个允许我在另一个对象中创建一个对象的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的构造函数,并且状态不在其中

2-检索对象p1并在其上调用add\u connection方法。在

提前谢谢


Tags: 对象nameyaml示例类型状态格式load
2条回答

让我们试试对象的真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)

获得:

^{pr2}$

永远不要尝试山药负荷()在模块的根块中,始终使用if __name__ == '__main__'或在确保调用一次的函数中调用它。在

请注意,yaml声明:

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

此时,yaml尝试导入myyaml.py公司同样,在另一个上下文中,如果您将山药负荷或者在模块的根目录中,您可能会遇到一个无限循环,或者一个意外的结果。在

补充pylover's answer:如果在某个时候需要对序列化/反序列化过程进行更多控制,请尝试yamlable。我们把这个包作为一个包来绑定,这样就可以获得更多的控制权。在

在您的例子中:

import yaml
import sys
from yamlable import YamlAble, yaml_info


@yaml_info(yaml_tag_ns='myyaml')
class StateMachine(YamlAble):

    def __init__(self, states, connections):
        self.states = states
        self.connections = connections

    # def to_yaml_dict(self):
    #     return vars(self)
    #
    # @classmethod
    # def from_yaml_dict(cls, dct, yaml_tag):
    #     return StateMachine(**dct)


@yaml_info(yaml_tag_ns='myyaml')
class State(YamlAble):

    def __init__(self, name):
        self.name = name

    # def to_yaml_dict(self):
    #     return vars(self)
    #
    # @classmethod
    # def from_yaml_dict(cls, dct, yaml_tag):
    #     return State(**dct)


@yaml_info(yaml_tag_ns='myyaml')
class Connection(YamlAble):

    def __init__(self, pim):
        self.pim = pim

    # def to_yaml_dict(self):
    #     return vars(self)
    #
    # @classmethod
    # def from_yaml_dict(cls, dct, yaml_tag):
    #     return Connection(**dct)


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

    print(yaml.safe_dump(o))

    # Note: these also work
    # print(o.loads_yaml(""" ... """))
    # print(o.dumps_yaml())

    sys.exit(0)

如果需要更改默认行为,例如只转储某些字段,或更改其结构以进行转储,或在加载时执行某些自定义实例创建,请取消对相应方法的注释。在

有关详细信息,请参见yamlable documentation

相关问题 更多 >