【问题标题】:PyYAML dump Python object without tagsPyYAML 转储没有标签的 Python 对象
【发布时间】:2018-02-15 17:55:26
【问题描述】:

如何使用 PyYAML 转储不带标签的 Python 对象? 我有这样的课:

class Monster(yaml.YAMLObject):
    yaml_tag = u'!Monster'
    def __init__(self, name, hp, ac, attacks):
        self.name = name
        self.hp = hp
        self.ac = ac
        self.attacks = attacks

然后我尝试转储:

print(yaml.dump(Monster(name='Cave lizard', hp=[3,6], ac=16, attacks=['BITE','HURT'])))

得到了结果:

!Monster
ac: 16
attacks: [BITE, HURT]
hp: [3, 6]
name: Cave lizard

但是想要的结果是:

ac: 16
attacks: [BITE, HURT]
hp: [3, 6]
name: Cave lizard

我怎样才能得到这个?

【问题讨论】:

    标签: python-3.x pyyaml


    【解决方案1】:

    由于您不想发出标签,因此您应该将执行此操作的方法更改为无操作:

    import yaml
    import sys
    
    class Monster(yaml.YAMLObject):
        yaml_tag = u'!Monster'
        def __init__(self, name, hp, ac, attacks):
            self.name = name
            self.hp = hp
            self.ac = ac
            self.attacks = attacks
    
    def noop(self, *args, **kw):
        pass
    
    yaml.emitter.Emitter.process_tag = noop
    
    yaml.dump([
        Monster(name='Cave lizard', hp=[3,6], ac=16, attacks=['BITE','HURT']),
        Monster(name='Sméagol', hp=400, ac=14, attacks=['TOUCH','EAT-GOLD']),
    ], sys.stdout, allow_unicode=True)
    

    给出:

    - ac: 16
      attacks: [BITE, HURT]
      hp: [3, 6]
      name: Cave lizard
    - ac: 14
      attacks: [TOUCH, EAT-GOLD]
      hp: 400
      name: Sméagol
    

    请注意,使用print(yaml.dump()) 在时间和内存方面效率低下。 PyYAML 有一个流式接口,所以你应该直接使用它而不是流式传输到缓冲区,然后使用print() 流式传输缓冲区

    【讨论】:

    • 更简洁的 lambda 方式:yaml.emitter.Emitter.process_tag = lambda self, *args, **kw: None
    猜你喜欢
    • 2017-08-08
    • 2019-09-13
    • 1970-01-01
    • 2017-10-01
    • 2023-01-11
    • 2014-01-15
    • 2021-05-20
    • 2016-07-18
    相关资源
    最近更新 更多