【发布时间】:2011-06-08 07:12:49
【问题描述】:
我正在尝试腌制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 的定义移到顶层可以解决问题,尽管我仍然很好奇为什么会发生这种情况。)
【问题讨论】:
-
使用 python3 和 pickle 协议 4 解决了这个问题
-
@DaveButler 的回答是否正确?谁能确认或否认?