我怎样才能压制'无'在Python中输出yaml.dump?

时间:2015-11-21 03:12:50

标签: python class python-3.x data-structures yaml

我有一个(简化的)类打印出它的结构,而不需要重新加载对象(yaml.load将不会被使用)。

是否有一种快速方法可以抑制None输出(包括设置为None的变量)?也许yaml.representer可以某种方式使用。

import yaml

class A:
    def __init__(self):
        self.a = None
        self.b = [1,2,3]

    def __repr__(self):
        return yaml.dump(self)

A()

输出

!!python/object:__main__.A
a: null
b: [1, 2, 3]

而我需要:

!!python/object:__main__.A
b: [1, 2, 3]

这篇文章仍然有效。我寻求整洁/健全的想法。

2 个答案:

答案 0 :(得分:3)

您可以通过继承YAMLObject并定义to_yaml类方法来完成此操作。对于您的特定示例:

import yaml

class A(yaml.YAMLObject):
    yaml_tag = u'!A'

    def __init__(self):
        self.a = None
        self.b = [1, 2, 3]

    def __repr__(self):
        return yaml.dump(self)

    @classmethod
    def to_yaml(cls, dumper, data):
        cleaned_data = dict((k, v) for (k, v) in data.__dict__.items() if v is not None)
        return dumper.represent_mapping(cls.yaml_tag, cleaned_data)

上面的类方法会跳过None的任何值,只给出我们想要的实例值。然后,当我们使用它时,我们得到了我们期望的输出:

>> print yaml.dump(A())
!A
b: [1, 2, 3]

关于子类化YAMLObject的文档:http://pyyaml.org/wiki/PyYAMLDocumentation#YAMLObject

yaml Dumper上的文档: http://pyyaml.org/wiki/PyYAMLDocumentation#Dumper

答案 1 :(得分:1)

以下是将转储输出转换为字符串然后格式化的粗略技术,但您可以在方法中很好地抽象它:

>>> A()
!!python/object:__main__.A
a: null
b: [1, 2, 3]

>>> test = A()
test_string = str(test)
test_split = test_string.split("\n")

>>> test_split
['!!python/object:__main__.A', 'a: null', 'b: [1, 2, 3]', '']

>>> print test_split[0] + "\n" + test_split[2] + "\n"
!!python/object:__main__.A
b: [1, 2, 3]

您可以将其隐藏在 repr 功能中。另一个标准库解决方案,我认为最后一个,祝你好运:

import yaml

class A:
    def __init__(self):
        self.a = None
        self.b = [1,2,3]
        self.c = None
        self.d = 'wheee'

    def __repr__(self):
        string = re.sub(r'.*: null', '',str(yaml.dump(self)))
        string_split = string.split('\n')
        lines = [line for line in string_split if line.strip() != '']
        return '\n'.join(map(str, lines))

在这种情况下,我们仍然可以得到预期的结果:

!!python/object:__main__.A
b: [1, 2, 3]
d: wheee