如何“保存”一个实例而不是它的引用?(Pickle)
我正在使用一个“类”来保存一些属性。
class Args:pass
args = Args()
args.test = "test"
args.bla = [...]
然后我把 args
作为 data
传递给其他函数(data=args
)。我觉得我的问题在于,给 data
的只是一个引用:data = <__main__.Args object at 0x09E41050>
。
我尝试使用 Pickle,但出现了这个错误:pickle.PicklingError: Can't pickle <class '__main__.Args'>: it's not found as __main__.Args
。
我不太确定问题是否是由引用引起的,但我觉得可能是。
2 个回答
1
问题是什么呢?如果你使用 dill
,而不是 pickle
,那么 dill
能够正确识别类的定义,并且能正确地把类的实例和它关联起来……这样一来,实例就可以顺利地被保存了。
dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39)
[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 as pickle
>>> class Args: pass
...
>>> args = Args()
>>> args.test = 'test'
>>> args.bla = ['foo']
>>>
>>> _args = pickle.dumps(args)
>>> __args = pickle.loads(_args)
>>> __args
<__main__.Args instance at 0x101bf3560>
>>> __args.test
'test'
>>> __args.bla
['foo']
>>>
在 dill
中这样做是可行的,因为 dill
可以保存类的源代码,而不需要像 pickle
那样通过类的名字来保存。
你可以在这里获取 dill
: https://github.com/uqfoundation
1
解决方案在这里:Martijn在另一个问题上的回答
我在一个函数里“创建”我的类,这就是问题所在。抱歉重复提问,应该搜索得更仔细一些。无论如何,还是谢谢大家!