我认为您正在寻找以下功能之一……</p>
这里我建立了一个类和一个实例,然后更改了类定义。腌制的类和实例仍然是不可腌制的,因为dill
默认情况下腌制类的源代码......并管理在命名空间中具有多个具有相同名称的类(它只是通过管理对类定义的指针引用来做到这一点)。
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
泡菜会在上面炸毁。如果您不想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
>>>
我希望这会有所帮助。