Я работаю над библиотекой, которая загружает файлы (hfd5 - pytables) в структуру объекта. Фактические классы используются для структуры загружается в виде строки из файла hdf5, а затем загружен таким образом:В python, как вы можете разгрузить сгенерированные классы
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)
Только примечание: я уже приводил доводы против использования разбора от текста в файле для создания классов ранее, но, видимо, они настроены на использование это здесь и увидеть некоторые преимущества, которых я не знаю, поэтому уйти от этого решения сейчас не представляется возможным.
Собственно, уход из этого не-решения всегда возможен. Если он загромождает память безвозвратным мусором, он не работает. –
Я помню, где-то читал (comp.lang.python? Список Python-Dev? Не помню, где), что основная команда разработчиков полностью знает тот факт, что объекты класса не могут быть собраны, а IIRC Guido сказал: «Если вы «динамически создавая в вашем коде тысячи классов, что-то не так с вашим алгоритмом», но ICBW. – tzot