使不可pickle的对象可pickle。
项目描述
使不可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文件