繁体   English   中英

使用 pyyaml/ruamel.yaml 有条件地转储属性

[英]Conditionally dumping an attribute using pyyaml/ruamel.yaml

我有一个像这样的 Python 类:

from dataclasses import dataclass
from ruamel.yaml import yaml_object, YAML

yaml = YAML()

@yaml_object(yaml)
@dataclass
class DataObject:
    normal_attr: str
    normal_attr_2: str
    conditional_attr: str

我希望再能有条件地转储conditional_attr使用ruamel.yaml基于某些条件(这是基于PyYaml)。 理想情况下,它会像这样工作:

data = DataObject()

if verbose_output:
    yaml.dump(data, stream)
else:
    yaml.dump(data, stream, exclude=['conditional_attr'])

当然这实际上不起作用,但是有什么方法可以实现这种行为吗?

我认为将排除某些映射键作为转储方法的一个选项来实现不是一个好主意。

除了那个ruamel.yaml已经有一个记录的方法来做特殊的转储,你可以用它来过滤掉任何属性,例如那些名称以conditional_开头的属性:

import sys
from dataclasses import dataclass
from ruamel.yaml import yaml_object, YAML

yaml = YAML()

verbose_output = False

@yaml_object(yaml)
@dataclass
class DataObject:
    normal_attr: str
    normal_attr_2: str
    conditional_attr: str

    @classmethod
    def to_yaml(cls, representer, node):
        d = {}
        for k in node.__annotations__:
            if not verbose_output and k.startswith('conditional_attr'):
                continue
            d[k] = node.__getattribute__(k)
        return representer.represent_mapping('!DataObject', d)

data = DataObject(normal_attr='a', normal_attr_2='b', conditional_attr='c')

yaml.dump(data, sys.stdout)

这给出:

!DataObject
normal_attr: a
normal_attr_2: b

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM