Лучший способ справиться с перезагрузкой объектов, а не модулей - PullRequest
2 голосов
/ 21 июля 2010

Я много занимаюсь разработкой в ​​IPython, где

In[3]: from mystuff import MyObject

и затем я делаю много изменений в mystuff.py. Чтобы обновить пространство имен, мне нужно сделать

In[4]: reload(mystuff)
In[5]: from mystuff import MyObject

Есть ли лучший способ сделать это? Обратите внимание, что я не могу импортировать MyObject, ссылаясь на mystuff напрямую, как при

In[6]: import mystuff
In[7]: mystuff.MyObject

, поскольку в коде это не так. Еще лучше было бы, чтобы IPython автоматически делал это, когда я пишу файл (но это, вероятно, вопрос в другой раз).

Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 21 июля 2010

Для этого можно использовать функцию deep_reload из IPython.

http://ipython.scipy.org/doc/manual/html/interactive/reference.html?highlight=dreload

Если вы запустите ipython с параметром -deep_reload, чтобы заменить обычный метод reload().

И если это не поможет вам, вы сможете написать скрипт для автоматической замены всех импортированных модулей в области. Довольно хакерский, но это должно сработать;)

Я только что нашел модуль ipy_autoreload. Возможно, это может помочь вам немного. Я еще не уверен, как это работает, но это должно работать в соответствии с документами:

import ipy_autoreload
%autoreload 1
0 голосов
/ 13 ноября 2014

Попробуйте использовать% run magic для импорта содержимого редактируемого файла. Когда вы используете это для импорта объектов из файла, он обновляет эти объекты каждый раз, когда вы запускаете его%. Таким образом, он не загружается автоматически при каждом возврате каретки.

0 голосов
/ 21 июля 2010

Если объект является классом или функцией, вы можете использовать его атрибут __module__, чтобы определить, какой модуль перезагрузить:

def reload_for(obj):
    module = reload(__import__(obj.__module__, fromlist=True))
    return getattr(module, obj.__name__)

MyClass = reload_for(MyClass)
...