2

まったく奇妙なエラーに遭遇しました。選択したものを 1 つのファイルに保存しています。これらの 1 つは 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()      

ファイルの直前にトラッカーから何かを印刷する場合、純粋にトラッカーがまだ存在することをテストするために、トラッカーを実際に検出できます。しかし、1行後に次のようになります。

  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(tracker) を実行すると、次のことが明らかになります。

  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
4

1 に答える 1

5

その例外は の内部から発生cPickle.Pickler.dumpしていますが、コンパイルされた C モジュールにあるため、トレースバックには表示されません。エラーが何であるかを知るには、同じことを手動でトリガーしてみてください。ただしpickle、コンパイル済みの C モジュールではなく、純粋な Python モジュールを使用しcPickleます。

import pickle
pickle.dumps(tracker)

これにより、エラーの場所が明らかになるはずです。私の最初の推測は、__reduce_ex__orの実装が__reduce__値を返さないということです。

于 2012-12-29T02:49:55.727 に答える