我有一个(简化的)类,它可以打印出它的结构,而无需重新加载对象(不会使用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]
此帖子仍处于活动状态。我寻求简洁/有力的想法。
您可以通过子类化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
以下是一种粗糙的技术,将转储的输出转换为字符串,然后进行格式化,但您可以在方法中很好地抽象它:
>>> 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