跳转到主要内容

使不可pickle的对象可pickle。

项目描述

PyPI-License PyPI-Version

使不可pickle的对象可pickle。

安装

您可以通过pip安装它

pip install pickle-mixin

运行测试

安装后,您可以通过pytest进行测试。

python -c "import pickle_mixin; pickle_mixin.test()"

只要您有pytest。

用法

通过初始化pickle

假设您有一个对象不可pickle或需要大量磁盘空间或内存才能pickle的类。 PickleByInit类允许您通过对象初始化来pickle对象属性。考虑以下类

class Foo(PickleByInit):
    def __init__(self, obj):
        super(Foo, self).__init__()
        self.obj = obj

class Bar(object):
    def __init__(self, filename):
        self.filename = filename

    def __getstate__(self):
        raise PicklingError

    def init_dict(self):
        return dict(filename=self.filename)

尝试如下pickle

f = Foo(Bar('file.txt'))
pickle.dumps(f)

将引发一个PicklingError。另一方面,以下将工作

f = Foo(Bar('file.txt'))
f.set_signature_only_attr('obj')
pickle.dumps(f)

f.obj属性的un-pickling过程是通过对象初始化完成的,将init_dict返回的字典作为关键字参数传递给Bar.__init__

混合有和无槽的类

在这种情况下,pickle不保存通过__slots__定义的属性

class Foo(object):
    __slots__ = ['a']

    def __init__(self):
        self.a = 4


class Bar(Foo):
    def __init__(self):
        pass

SlotPickleMixin修复了这个问题

class FooMixin(object):
    __slots__ = ['a']

    def __init__(self):
        self.a = 4


class BarMixin(FooMixin, SlotPickleMixin):
    def __init__(self):
        FooMixin.__init__(self)
        SlotPickleMixin.__init__(self)

f = BarMixin()
o = pickle.dumps(f)
f = pickle.loads(o)
assert hasattr(f, 'a')

作者

许可

本项目的许可协议为MIT许可 - 有关详情,请参阅LICENSE文件

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪一个,请了解更多关于安装包的信息。

源分发

pickle-mixin-1.0.2.tar.gz (5.1 kB 查看哈希值)

上传于 源代码

由以下组织支持