0

shelve モジュール (shelve ヘルパーの copy_reg モジュール) で奇妙な例外が見られます。見てみると、Pickler クラスの __getstate__ メソッドへの参照を呼び出そうとしています。ただし、これは何らかの理由で None を返しているようです。他の誰かがこれを経験したことがあるかどうか、そしてシェルブを正しく機能させるためにできることがあるかどうか疑問に思いましたか?

私が見ている例外の戻りスタックは次のとおりです。

  File "/usr/local/lib/python2.7/dist-packages/libgsync/drive/__init__.py", line 497, in stat
    self._pcache[search] = ent
  File "/usr/lib/python2.7/shelve.py", line 132, in __setitem__
    p.dump(value)
  File "/usr/lib/python2.7/copy_reg.py", line 84, in _reduce_ex
    dict = getstate()
DEBUG:      libgsync/drive/__init__.py:387:walk(): Exception: 'NoneType' object is not callable

私は自由にコードを調べましたが、_reduce_ex() 関数で誤動作している場所は次のとおりです。

try:
    getstate = self.__getstate__
except AttributeError:
    if getattr(self, "__slots__", None):
        raise TypeError("a class that defines __slots__ without "
                        "defining __getstate__ cannot be pickled")
    try:
        dict = self.__dict__
    except AttributeError:
        dict = None
else:
    dict = getstate()

最初に、self.__getstate__ を getstat に割り当てるため、この時点で呼び出し可能になっているはずです。else ブロックのコンテキストで実行されているため、例外は発生していないようです。変...

例外が発生しているコード行からのデバッグ出力を次に示します。

DEBUG:        libgsync/drive/__init__.py:496:stat(): Updating path cache: /unittest

そして、ここに例外の原因となるコードがあります:

# Update path cache.
if self._pcache.get(search) is None:
    debug("Updating path cache: %s" % search)
    self._pcache[search] = ent
4

1 に答える 1

0

シェルフ ディクショナリに割り当てられている値は、コピー可能なオブジェクトではありませんでした。辞書がキャッシュされるまで、辞書のクラス ラッピングを延期することで問題を解決しました。

于 2013-06-01T19:54:46.723 に答える