无法腌制 yaml 实例 (ruamel)

问题描述 投票:0回答:2

我正在尝试腌制一个非常大的对象,但遇到了以下错误(python 3.8.5):

TypeError: cannot pickle '_io.TextIOWrapper' object

我设法将其范围缩小到一个简单的例子:

test.yaml(无关):

Hello there: General Kenobi
Universe: 42

问题在这里:

import pickle
from ruamel.yaml import YAML

class C:
    def __init__(self):
        self.yaml = YAML()
        with open("test.yaml", 'r') as yamlFile:
            self.my_yaml = self.yaml.load(yamlFile)

c = C()

with open("test.pkl", 'wb') as output:
    pickle.dump(c, output, pickle.HIGHEST_PROTOCOL)

据我猜测,self.yaml 包含对文件流的引用。 问题是我已经将此文件加载到我的对象中并且不需要存储它。

有办法避免这种行为吗?

我可以在酸洗之前删除 yaml 实例,然后重新实例化一个实例,但我宁愿将其包含在内。

编辑:

上面的代码片段只是一种轻松重现错误的方法。 我实际上使用一个对象来存储 YAML 和派生字典方法。其他对象调用这个实例来处理/转储它们的字典。 yaml 实例保存在属性中,因为我添加了其他方法可以使用的表示。 如果实例只是本地的,我需要重新定义每个方法中的所有自定义

python yaml pickle ruamel.yaml
2个回答
0
投票

我不确定为什么将

YAML()
实例分配给
C
实例的属性,您可以只使用
__init__
本地的普通变量,并且酸洗不会尝试转储它:

import pathlib

class C:
    def __init__(self):
        yaml = YAML()
        yaml_file = pathlib.Path('test.yaml')
        self.my_yaml = yaml.load(yaml_file)

0
投票

按照用户 flyx 的建议,我设法通过使用 __getstate__

__setstate__
排除 yaml 实例
 来腌制对象。

感谢您的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.