我刚刚碰到了一个非常奇怪的错误。我将选择的内容保存到一个文件中。其中一个是一个叫做Tracker的类的版本,这个副本叫做Tracker。
file = shelve.open(worldname, 'n')
file['Terramap'] = terramap
file['Satmap'] = satmap
file['Gasmap'] = gasmap
file['Planetset'] = planetset
file['World'] = minimap
file['Picture'] = picturemap
file['Worlddata'] = worlddata
file['Dimension'] = dimension
print "check", len(tracker.families)
file['Tracker'] = tracker
file['Schedule'] = schedule
file['Time'] = time
file.close()
如果我让它在文件之前从跟踪器打印一些东西,纯粹是为了测试跟踪器仍然存在,它确实可以检测到跟踪器。但是在一行之后,它出现了:
File "C:UsersMarkDesktopUltima Ratio RegumURR0-2-1.py", line 17522, in world_menu
file['Tracker'] = tracker
File "C:Python27libshelve.py", line 132, in __setitem__
p.dump(value)
TypeError: expected string or Unicode object, NoneType found
我只是…难住了。以前从未发生过这种事,我不明白这怎么可能!有人能解释一下吗?我今天所做的就是向tracker添加一些东西,但tracker只存储字符串列表,最多几千个,仅此而已。但是,如果我让它在保存开始之前创建一个新的跟踪器,它就会保存得很好。
编辑:运行pickle.dumps(tracker)显示:
File "C:UsersMarkDesktopUltima Ratio Regum29-12-test.py", line 17515, in world_menu
pickle.dumps(tracker)
File "C:Python27libpickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "C:Python27libpickle.py", line 224, in dump
self.save(obj)
File "C:Python27libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python27libpickle.py", line 725, in save_inst
save(stuff)
File "C:Python27libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python27libpickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:Python27libpickle.py", line 663, in _batch_setitems
save(v)
File "C:Python27libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python27libpickle.py", line 600, in save_list
self._batch_appends(iter(obj))
File "C:Python27libpickle.py", line 615, in _batch_appends
save(x)
File "C:Python27libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python27libpickle.py", line 725, in save_inst
save(stuff)
File "C:Python27libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python27libpickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:Python27libpickle.py", line 663, in _batch_setitems
save(v)
File "C:Python27libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python27libpickle.py", line 748, in save_global
(obj, module, name))
PicklingError: Can't pickle <built-in method capitalize of str object at 0x0A1341C0>: it's not found as __main__.capitalize
该异常来自cPickle.Pickler.dump
的内部,但它没有出现在追溯中,因为它在编译的C模块中。要获得错误的指示,请尝试手动触发相同的事情,但使用纯python pickle
模块而不是编译的C cPickle
模块:
import pickle
pickle.dumps(tracker)
这将显示错误的位置。我的第一个猜测是,您的__reduce_ex__
或__reduce__
的实现不返回值。