忽略PyYAML转储的对象

时间:2017-03-17 03:38:41

标签: yaml pyyaml

我使用PyYAML转储来打印复杂的数据结构,但是有一类对象不能被转储,也不想被转储。

目前我得到:

yaml.representer.RepresenterError: cannot represent an object

我希望yaml.dump完全忽略这个特定的类,或者只是渲染类名并继续照常进行。

如果可以,我该怎么做?

1 个答案:

答案 0 :(得分:1)

您必须为对象提供代表。有多种方法可以做到这一点,有些方法涉及更改对象。

当您明确注册一个代表人时,该对象不必更改:

import sys
from ruamel import yaml


class Secret():
    def __init__(self, user, password):
        self.user = user
        self.password = password


def secret_representer(dumper, data):
        return dumper.represent_scalar(u'!secret', u'unknown')

yaml.add_representer(Secret, secret_representer)

data = dict(a=1, b=2, c=[42, Secret(user='cary', password='knoop')])

yaml.dump(data, sys.stdout)

secret_representer中,data是实例化的Secret(),因为该功能没有使用它,没有"秘密"被泄露了。你也可以,例如返回用户名,但不是密码。 represent_scalar函数需要一个标记(此处我使用!secret)和一个标量(此处为字符串unknown)。

以上的输出:

a: 1
b: 2
c: [42, !secret '[unknown]']

我在上面使用的是ruamel.yaml,这是PyYAML的升级版本(免责声明:我是该软件包的作者)。以上内容也适用于PyYAML。