Python 3.x PyYAML转储不带标记的Python对象

Python 3.x PyYAML转储不带标记的Python对象,python-3.x,pyyaml,Python 3.x,Pyyaml,如何使用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 然后我尝试转储: p

如何使用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

我怎样才能做到这一点?

既然您不想发出标签,那么您应该将发出标签的方法更改为“无操作”:

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

请注意,使用
打印(yaml.dump())
在时间和内存方面效率低下。PyYAML有一个流接口,因此您应该直接使用它,而不是将数据流传输到缓冲区,然后使用lambda以更简洁的方式传输缓冲区:
yaml.emitter.emitter.process_tag=lambda self,*args,**kw:None