gpt4 book ai didi

python - Pickle: AttributeError: 'module' 对象没有属性

转载 作者:太空狗 更新时间:2023-10-30 02:33:03 26 4
gpt4 key购买 nike

我发现了很多关于这个的线程,但所有线程的问题都是命名空间。我的问题与命名空间无关。

一个小例子:

import cPickle as pickle
from uncertainties import Variable

class value(Variable):
def __init__(self, args, showing=False):
self.show = showing
Variable.__init__(self, args[0], args[1])

val = value((3,1), True)
print val.nominal_value, val.std_dev(), val.show
fobj = file("pickle.file", "w")
pickle.dump(val, fobj)
fobj.close()

fobj = file("pickle.file", "r")
val = pickle.load(fobj)
fobj.close()
print val.nominal_value, val.std_dev(), val.show

这段代码的输出:

3.0 1.0 True
3.0 1.0
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
173 else:
174 filename = fname
--> 175 __builtin__.execfile(filename, *where)

/home/markus/pickle.py in <module>()
19 val = pickle.load(fobj)
20 fobj.close()
---> 21 print val.nominal_value, val.std_dev(), val.show

AttributeError: 'value' object has no attribute 'show'

pickling 和 unpickling 的命名空间相同。 uncertainties.Variable 的所有属性都已恢复 - 只有我添加的一个“show”被遗漏了。

最佳答案

uncertainties.Variable() class使用 __slots__ attribute以节省内存。因此,要成为可 pickle 的,它必须定义一个 __getstate__ method以及(参见 Why am I getting an error about my class defining __slots__ when trying to pickle an object?)。

如果您需要添加自己的附加属性,则必须覆盖该 __getstate__ 方法。在您自己的 __slot__ 属性中声明您的附加属性可能也是一个好主意:

from uncertainties import Variable

class value(Variable):
__slots__ = ('show',) # only list *additional* slots

def __init__(self, args, showing=False):
self.show = showing
super(value, self).__init__(args[0], args[1])

def __getstate__(self):
obj_slot_values = {}
for cls in type(self).mro():
obj_slot_values.update((k, getattr(self, k)) for k in getattr(cls, '__slots__', ()))
# Conversion to a usual dictionary:
return obj_slot_values

这个新的 __getstate__ 是必需的,因为 Variable.__getstate__ 方法假定只有 一个 __slots__属性,而 MRO 中的每个类可能都有一个。

这确实是 uncertainties 库的一个限制;我已经提交了 pull request这解决了这个问题,并消除了在子类中重写 __getstate__ 方法的需要。

关于python - Pickle: AttributeError: 'module' 对象没有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15117372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com