ファイル (hfd5 - pytables) をオブジェクト構造にロードするライブラリに取り組んでいます。構造体に使用されている実際のクラスは、hdf5 ファイルから文字列として読み込まれ、次の方法で読み込まれます。
class NamespaceHolder(dict):
# stmt is the source code holding all the class defs
def execute(self, stmt):
exec stmt in self
問題は、このように複数のクラスをロードすると、ガベージ コレクションの収集不可能な部分、つまり実際のクラス定義にオブジェクトが表示されることです。これをグローバル ディクショナリに読み込むこともできますが、問題は孤立したクラスのままです。クラスをアンロードする方法はありますか?
主な問題はクラスです。mro属性には、クラス自体への参照が含まれているため、ガベージ コレクターが処理できない循環参照が発生します。
以下は、自分で確認するための小さなテスト ケースです。
import gc
if __name__ == "__main__":
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)
code = """
class DummyA(object):
pass
"""
context = {}
exec code in context
exec code in context
gc.collect()
print len(gc.garbage)
注意: 以前にクラスを作成するためにファイル内のテキストの解析を使用することに反対したことはすでにありますが、どうやら彼らはここでそれを使用することに設定されており、私が知らないいくつかの利点があるため、このソリューションから離れることは今のところ現実的ではありません.