0

shelve モジュールを使用して、プログラムに永続性を追加しています。最初はシェルブでデフォルトのbsddbを使用していましたが、gdbmに変更する必要があり、その後例外が発生しました:

    Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type       'exceptions.AttributeError'> ignored

whichdb 呼び出しによって anydbm モジュールで発生 (およびキャッチ) されているようです。

コードは問題なく終了するため、悪いことは何もありませんが、ちょっと悪いように見えます。私の知る限り、警告モジュールを使用して印刷を抑制することができますが、例外を完全に削除したいと考えています。

私は他の場所(pylint、django、およびその他のモジュール/パッケージで発生した)で同様の問題を調べていましたが、どこでも「バグ」としてマークされているようです。anydbm/shelve モジュールでこのような動作の解決策を思いついた人はいますか?

編集1。このエラーの原因は次のとおりであることがわかりました: def getattr (self, attr): return getattr(self.config, attr)

別のクラスをラップするクラスをシェルブに保存しようとしています。そのため、getattr関数がオーバーライドされます。それを書いて無限ループにならないようにする方法はありますか?

4

1 に答える 1

1

わかりました、問題を解決できたと思います。問題は、ラッパー クラスにsetstateおよびgetstate関数がなかったことです。これまでのところ、うまくいくようです。ラップされたクラスにはsetstategetstateは必要ありません。

ラッパー クラスには単純な getstate 関数と setstate 関数を使用しました。

    def __getstate__(self):
        '''
        Getstate for pickle (used by shelve module)
        '''
        return self.__dict__

    def __setstate__(self, dictionary):
        '''
        Setstate for pickle (used by shelve module)
        '''
        self.__dict__ = dictionary
于 2012-09-11T13:30:56.603 に答える