Обход дерева объектов Python - PullRequest
1 голос
/ 17 июля 2009

Я пытаюсь реализовать динамическую перезагрузку объектов в 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)

И на удивление это работает! После вызова метода refresh () для моих объектов новый код вступает в силу, без необходимости его повторного создания.

Но я не уверен, что это правильный путь для прохождения объекта? Есть ли лучший способ пройти компоненты объекта?

1 Ответ

1 голос
/ 17 июля 2009

См. этот рецепт в Кулинарной книге Python (или, может быть, даже лучше ее версию в "печатной" книге, которую, я полагаю, вы действительно можете прочитать бесплатно с помощью поиска книг в Google или наверняка на O ' Сайт Reilly "Safari" с бесплатной 1-недельной пробной подпиской - я много редактировал оригинальный рецепт Хадсона, чтобы получить версию "печатной книги"!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...