我剛碰到一個完全奇怪的錯誤。我將選擇的東西保存到一個文件中。其中之一是稱爲Tracker的類的一個版本,並且該副本稱爲跟蹤器。Python擱置錯誤 - 索賠NoneType,但對象*是*有
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:\Users\Mark\Desktop\Ultima Ratio Regum\URR0-2-1.py", line 17522, in world_menu
file['Tracker'] = tracker
File "C:\Python27\lib\shelve.py", line 132, in __setitem__
p.dump(value)
TypeError: expected string or Unicode object, NoneType found
我只是...難住了。這從來沒有發生過,我不明白這是怎麼回事!任何人都可以對此有所瞭解嗎?我所做的一切都是今天將一些東西添加到跟蹤器中,但跟蹤器只能存儲多達數千個字符串,但僅此而已。但是,如果我在保存開始之前創建了一個新的追蹤器,它可以很好地保存。
編輯:
運行pickle.dumps(跟蹤)顯示:
File "C:\Users\Mark\Desktop\Ultima Ratio Regum\29-12-test.py", line 17515, in world_menu
pickle.dumps(tracker)
File "C:\Python27\lib\pickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "C:\Python27\lib\pickle.py", line 224, in dump
self.save(obj)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 725, in save_inst
save(stuff)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python27\lib\pickle.py", line 663, in _batch_setitems
save(v)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 600, in save_list
self._batch_appends(iter(obj))
File "C:\Python27\lib\pickle.py", line 615, in _batch_appends
save(x)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 725, in save_inst
save(stuff)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python27\lib\pickle.py", line 663, in _batch_setitems
save(v)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.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.dump'的內部,在那裏獲得'None'而不是一個字符串;試試這個:'import pickle; pickle.dumps(跟蹤器)'。這應該讓你更好地指出它出錯的地方。這可能是你的'__reduce__'實現中的一個問題。 –
感謝您的快速回復 - 我應該在嘗試保存跟蹤器之前還是之後進行此操作? – UltimaRatioRegum
之前(所以它發生) –