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