Пересечение дерева объектов Python
Вопрос
Я пытаюсь реализовать динамические объекты перезагрузки в Python, которые отражают изменения кода в прямом эфире.
Модули перезагрузка работает, но я должен воссоздать каждый экземпляр классов модулей, чтобы изменения стали эффективными.
Проблема в том, что объекты (объекты (объекты __dict__
Содержание) теряется во время процесса.
Итак, я попробовал еще один подход:
def refresh(obj, memo=None):
if memo is None:
memo = {}
d = id(obj)
if d in memo:
return
memo[d] = None
try:
obj.__class__ = getattr(sys.modules[obj.__class__.__module__],
obj.__class__.__name__)
except TypeError:
return
for item in obj.__dict__.itervalues():
if isinstance(item, dict):
for k, v in item.iteritems():
refresh(k, memo)
refresh(v, memo)
elif isinstance(item, (list, tuple)):
for v in item:
refresh(v, memo)
else:
refresh(item, memo)
И удивительно это работает! После вызова обновления () на моих объектах новый код становится эффективным, без необходимости воссоздать их.
Но я не уверен, является ли это правильным способом пересечения объекта? Есть ли лучший способ пересечь компоненты объекта?
Решение
Видеть этот рецепт В кулинарной книге Python (или, может быть, даже лучше ее версии в «печатной», которая, я полагаю, вы можете бесплатно читать с поиском Google Book или, конечно, на сайте O'Reilly's "Safari", используя бесплатную 1-недельную пробную версию Подписка - я много редактировал оригинальный рецепт Гудзона, чтобы получить версию «Печать книги»!).