我想腌制一个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()
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?问题Bar是成员Foo吗?(将定义Bar移到顶层可以解决问题,尽管我仍然很好奇为什么会发生这种情况.)
我需要编写一个存储为namedtuple文件的数据结构,并namedtuple在python 中将其读回.
这里的解决方案建议使用Json.load/ loads或pickle以字符串的形式将变量写为json键值对.但是,我的所有字段访问/解除引用都是形式struct.key(而不是struct["key"]访问json值的方式),并且在整个代码中纠正这一点是不可行的.
我想将它存储到一个文件中,因为结构很大并且需要花费很多时间来生成.