python - 如何使用 dill 序列化类定义?

标签 python pickle dill

在对 Python pickle: dealing with updated class definitions 的回答中,dill 包的作者写道:

“好的,我已经在 github 上的最新修订版中将此功能添加到 dill 中。实现起来比我想象的要少得多......只需用 pickle 序列化类定义,瞧。”

安装了 dill 并对其进行了修改后,如何在 dill 中实际使用此功能对我来说并不明显。有人可以提供一个明确的例子吗?我想 pickle 类实例并序列化类定义。

(我是 python 的新手,我认为这个功能非常重要,因为当 pickle 一个对象时,最好尽可能接近保证你可以查看该对象(可能是模拟)在类定义可能发生更改之后的将来,并且您没有以易于访问的方式跟踪所有更改。)

最佳答案

我认为您正在寻找以下功能之一......

在这里,我构建了一个类和一个实例,然后更改了类定义。 pickle 的类和实例仍然是不可 pickle 的,因为 dill pickle 默认情况下该类的源代码……并管理多个类 在命名空间中具有相同的名称(它通过管理指针来简单地做到这一点 对类定义的引用)。

Python 2.7.8 (default, Jul 13 2014, 02:29:54) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x+self.y       
...   y = 1
... 
>>> f = Foo()
>>> _Foo = dill.dumps(Foo)
>>> _f = dill.dumps(f)
>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*self.z  
...   z = -1 
... 
>>> f_ = dill.loads(_f, ignore=True)
>>> f_.y
1
>>> f_.bar(1)
2
>>> Foo_ = dill.loads(_Foo)
>>> g = Foo_()
>>> g.bar(1)
2

pickle 会在上面爆炸。如果您不希望 dill 显式序列化该类,并执行 pickle 所做的操作,那么您可以要求 dill 通过引用进行 pickle使用 dill.dumps(Foo, byref=True)。或者,您可以使用 ignore=False(默认设置)动态决定忽略新定义的类。

现在,在下面的例子中,我们使用新的类定义,并提取源代码 从对象中,然后将其保存到文件中。此外,我们可以将源转储到一个文件(这里我使用一个临时文件),以便稍后导入。

>>> sFoo = dill.source.getsource(Foo)
>>> print sFoo
class Foo(object):
  def bar(self, x):
    return x*self.z
  z = -1

>>> open('myFoo.py', 'w').write(sFoo)    
>>>
>>> f = dill.temp.dump_source(Foo, dir='.')
>>> f.name
'/Users/mmckerns/dev/tmpM1dzYN.py'
>>> from tmpM1dzYN import Foo as _Foo_
>>> h = _Foo_()
>>> h.bar(2)
-2
>>> from myFoo import Foo as _SFoo_
>>> _SFoo_.z
>>> -1
>>> 

希望对您有所帮助。

关于python - 如何使用 dill 序列化类定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25613543/

相关文章:

python-3.x - 类型错误 : can't pickle dict_items objects

python-3.x - Python 类型、pickle 和序列化

python - 使用 dill 库保存和加载 neupy 算法可以在同一时间段返回不同的预测吗?

python - Pandas - 与丢弃重复相反,先保留

python - Twisted Matrix 和 telnet 服务器实现

Python3 unpickle 字节对象的字符串表示

python - 保存文件的最佳实践 - python pickle 用例

python - 在 python 中使用 dill 取消选择对象

Python 2.7 全局变量?

python - 使用 OpenCL 从灰度图像中过滤全白像素