Python:无法腌制类型X,属性查找失败 [英] Python: Can't pickle type X, attribute lookup failed
问题描述
我正在尝试腌制namedtuple
:
from collections import namedtuple
import cPickle
class Foo:
Bar = namedtuple('Bar', ['x', 'y'])
def baz(self):
s = set()
s.add(Foo.Bar(x=2, y=3))
print cPickle.dumps(s)
if __name__ == '__main__':
f = Foo()
f.baz()
这将产生以下输出:
Traceback (most recent call last):
File "scratch.py", line 15, in <module>
f.baz()
File "scratch.py", line 11, in baz
print cPickle.dumps(s)
cPickle.PicklingError: Can't pickle <class '__main__.Bar'>: attribute lookup __main__.Bar failed
我做错了什么?问题Bar
是Foo
的成员吗? (将Bar
的定义移到最高级别可以解决此问题,尽管我仍然很好奇为什么会发生这种情况.)
What am I doing wrong? Is the problem that Bar
is a member of Foo
? (Moving the definition of Bar
to the top level solves the problem, although I'm still curious why this happens.)
推荐答案
是的,它是类成员这一事实是一个问题:
Yes, the fact that it's a class member is a problem:
>>> class Foo():
... Bar = namedtuple('Bar', ['x','y'])
... def baz(self):
... b = Foo.Bar(x=2, y=3)
... print(type(b))
...
>>> a = Foo()
>>> a.baz()
<class '__main__.Bar'>
问题在于,当namedtuple()
返回类型对象时,它不知道将其分配给类成员的事实-因此,它告诉类型对象其类型名称应为__main__.Bar
,即使它确实应该是__main__.Foo.Bar
.
The problem is that when namedtuple()
returns a type object, it isn't aware of the fact that it's being assigned to a class member - and thus, it tells the type object that its type name should be __main__.Bar
, even though it should really be __main__.Foo.Bar
.
这篇关于Python:无法腌制类型X,属性查找失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!