gpt4 book ai didi

python - 包含属性的 python 类的 ruamel.yaml 转储似乎会产生意外的 yaml 格式

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:10 29 4
gpt4 key购买 nike

我正在努力将 python 类数据转储到 YAML,以便稍后加载。我发现,使用 ruamel.yaml(和 PyYAML),当我使用属性转储类来管理类属性时,YAML 输出会更改为似乎无效的 YAML 语法。我将下面的代码放在一起来演示该行为

import sys
import ruamel.yaml

class MySampleClass(object):
def __init__(self, attribute1, attribute2):
self.attribute1 = attribute1
self.attribute2 = attribute2

@property
def attribute1(self):
return self.attribute1

@attribute1.setter
def attribute1(self, attribute1):
self.__attribute1 = attribute1


sample1 = MySampleClass("ABCD", "123")
yaml = ruamel.yaml.YAML()
yaml.register_class(MySampleClass)
yaml.dump(sample1, sys.stdout)

运行时会产生以下输出。正如您所看到的,装饰后的第一个属性具有意外的格式,而第二个属性则是 YAML 所期望的格式。

!MySampleClass
_MySampleClass__attribute1: ABCD
attribute2: '1234'

有没有办法克服这个问题,而无需从头开始为每个类编写自定义构造函数和表示器?

最佳答案

ruamel.yaml 不会将属性/ setter 作为“正常”属性处理,这就是为什么您会得到有趣的输出,它有效的 YAML。

首先,您应该更改 attribute1 属性,因为调用 print(sample1.attribute1) 将让你进入无限递归。

然后您可以创建一个具有适当的 to_yaml 方法的基类可用于转储所有类:

import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()

class ObjWithProperties(object):
@classmethod
def to_yaml(cls, representer, node):
tag = getattr(cls, 'yaml_tag', '!' + cls.__name__)
attribs = {}
for x in dir(node):
if x.startswith('_'):
continue
v = getattr(node, x)
if callable(v):
continue
attribs[x] = v
return representer.represent_mapping(tag, attribs)


@yaml.register_class
class MySampleClass(ObjWithProperties):
def __init__(self, attribute1, attribute2):
self.attribute1 = attribute1
self.attribute2 = attribute2

@property
def attribute1(self):
return self.__attribute1 # <<<< note the added double underscore to prevent recursion

@attribute1.setter
def attribute1(self, attribute1):
self.__attribute1 = attribute1


sample1 = MySampleClass("ABCD", "123")
yaml.dump(sample1, sys.stdout)

给出:

!MySampleClass
attribute1: ABCD
attribute2: '123'

关于python - 包含属性的 python 类的 ruamel.yaml 转储似乎会产生意外的 yaml 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59636864/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com