2012-12-29 22 views
2

我剛碰到一個完全奇怪的錯誤。我將選擇的東西保存到一個文件中。其中之一是稱爲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 
+0

這意味着你正在進入'cPickle.dump'的內部,在那裏獲得'None'而不是一個字符串;試試這個:'import pickle; pickle.dumps(跟蹤器)'。這應該讓你更好地指出它出錯的地方。這可能是你的'__reduce__'實現中的一個問題。 –

+0

感謝您的快速回復 - 我應該在嘗試保存跟蹤器之前還是之後進行此操作? – UltimaRatioRegum

+0

之前(所以它發生) –

回答

5

該異常是從cPickle.Pickler.dump的內部到來,但它不會出現在回溯,因爲它在存在的一個編譯的C模塊。要獲得的是什麼錯誤指示,請嘗試手動觸發同樣的事情,但與純Python pickle模塊,而不是編譯的C cPickle模塊:

import pickle 
pickle.dumps(tracker) 

這應該顯示錯誤所在。我的第一個猜測是,您的__reduce_ex____reduce__的實現不會返回值。

+0

編輯原始評論,以反映轉儲給了我什麼。看起來像capitalize()的問題? – UltimaRatioRegum

+0

哈 - 剛做了一個搜索,發現我偶然留下了一個大寫字母。否則我永遠不會發現!謝謝您的幫助。 – UltimaRatioRegum

+0

好。這是一個奇怪的錯誤要顯示,不是嗎? –

相關問題