我使用PyYAML转储来打印复杂的数据结构,但是有一类对象不能被转储,也不想被转储。
目前我得到:
yaml.representer.RepresenterError: cannot represent an object
我希望yaml.dump
完全忽略这个特定的类,或者只是渲染类名并继续照常进行。
如果可以,我该怎么做?
答案 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。