如何“保存”一个实例而不是它的引用?(Pickle)

1 投票
2 回答
653 浏览
提问于 2025-04-18 06:38

我正在使用一个“类”来保存一些属性。

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 那样通过类的名字来保存。

你可以在这里获取 dillhttps://github.com/uqfoundation

1

解决方案在这里:Martijn在另一个问题上的回答

我在一个函数里“创建”我的类,这就是问题所在。抱歉重复提问,应该搜索得更仔细一些。无论如何,还是谢谢大家!

撰写回答