![](/img/trans.png)
[英]Editing a .yaml file in Python using Pyyaml or 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.