首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带标签的PyYAML转储Python对象

不带标签的PyYAML转储Python对象
EN

Stack Overflow用户
提问于 2018-02-16 01:55:27
回答 1查看 2.2K关注 0票数 3

如何使用PyYAML转储没有标记的Python对象?我有这样的课程:

代码语言:javascript
复制
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

然后我试着转储:

代码语言:javascript
复制
print(yaml.dump(Monster(name='Cave lizard', hp=[3,6], ac=16, attacks=['BITE','HURT'])))

并得到了结果:

代码语言:javascript
复制
!Monster
ac: 16
attacks: [BITE, HURT]
hp: [3, 6]
name: Cave lizard

但期望的结果是:

代码语言:javascript
复制
ac: 16
attacks: [BITE, HURT]
hp: [3, 6]
name: Cave lizard

我怎么才能得到这个呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 17:15:37

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

代码语言:javascript
复制
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)

这就给出了:

代码语言:javascript
复制
- 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()流式传输缓冲区

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48813495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档