【发布时间】:2017-08-08 11:55:03
【问题描述】:
我使用 PyYAML 转储来打印复杂的数据结构,但有一类对象不能,而且我也不想被转储。
目前我得到:
yaml.representer.RepresenterError: cannot represent an object
我希望yaml.dump 完全忽略这个特定的类,或者只呈现类名并照常继续。
如果可以,我该怎么做?
【问题讨论】:
我使用 PyYAML 转储来打印复杂的数据结构,但有一类对象不能,而且我也不想被转储。
目前我得到:
yaml.representer.RepresenterError: cannot represent an object
我希望yaml.dump 完全忽略这个特定的类,或者只呈现类名并照常继续。
如果可以,我该怎么做?
【问题讨论】:
您必须为该对象提供一个表示器。有多种方法可以做到这一点,其中一些涉及更改对象。
当您显式注册代表时,不必更改对象:
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。
【讨论】: