【问题标题】:Ignoring objects for PyYAML dump忽略 PyYAML 转储的对象
【发布时间】:2017-08-08 11:55:03
【问题描述】:

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

目前我得到:

yaml.representer.RepresenterError: cannot represent an object

我希望yaml.dump 完全忽略这个特定的类,或者只呈现类名并照常继续。

如果可以,我该怎么做?

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2023-01-11
      • 2014-01-15
      • 2021-05-20
      • 2016-01-08
      • 1970-01-01
      相关资源
      最近更新 更多