最初に私の問題のいくつかの紹介:私の(複雑な)オブジェクトの1つは、破壊されるときにクリーンアップする必要があります。その理由は、最終的にcouchdbインスタンスに送信する必要のあるドキュメントのリストがあるためです(一括書き込みを実行するためにリストが保持されます)。オブジェクトが削除された場合は、ドキュメントのリストをサーバーに送信する必要があります。
リストをサーバーに送信するのは複雑なプロセスです。実際に送信する前に、更新するドキュメントの現在のリビジョンを取得する必要があります。ドキュメントはすでにcouchdbに存在している、削除されているなどの可能性があります。Couchdbはこの点で少し複雑です。問題を解決するためだけにこの機能を再実装することはできないことを明確にするために、これについて言及します(以下を参照)。
このプロセスでは、いくつかのアクションを実行するためにいくつかのグローバルオブジェクトに依存しています。具体的にlog
は、すべてのコードにあるように、ロギングを実行するためのモジュールオブジェクトがあります。
そして、このすべてのアクションは__del__
、私のクラスのメソッドからトリガーされます。しかし、オブジェクトが削除されると、次のエラーメッセージが表示されます。
Exception AttributeError: "'NoneType' object has no attribute 'WARNING'" in <bound method xxx.__del__ of <yyy.xxx object at 0xd08c48c>> ignored
明らかに、オブジェクトが削除されているとき、モジュールlog
オブジェクトは存在しません。私の質問は次のとおりです。
- グローバルオブジェクト(この場合はモジュールオブジェクト)が定義されなくなったのはなぜですか?
- Pythonはどのような順序でグローバルオブジェクトを削除しますか?この順序を変更できますか?オブジェクトを「最後に削除する」としてマークできますか?
- この動作を防ぐために何ができますか?
これが変えられないのなら、私は大きな問題を抱えています。同じパターンが私のコード全体にあり、クラスはモジュールlog
オブジェクトに依存してロギングを実行するか、他のモジュールオブジェクトを使用します。私のクラスのほとんどは__del__
メソッドを実装していませんが、実装しているクラスもあります。