我正在开发一个将文件(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)
请注意:我之前已经反对使用解析文件中的文本来创建类,但显然他们在这里使用它并且看到了一些我没有看到的好处,所以现在放弃这个解决方案是不可行的.