модуль перезагрузки, нужно пересобрать подмодули? - PullRequest
4 голосов
/ 12 мая 2010

извините, я уверен, что это просят кучу, но я не смог найти его.

в myModule.py:

from myModule.subModule import myClass

Я работаю над myClass и хочу остаться на моем сеансе ipython и проверить его. reload(myModule) не перекомпилирует myClass.

как я могу это сделать?

1 Ответ

2 голосов
/ 12 мая 2010

Вам необходимо повторить импорт после перезагрузки самого «подствольного» подмодуля. Например, дано:

$ mkdir myModule
$ touch myModule/__init__.py
$ cat >myModule/subModule.py
class MyClass(object): kind='first'

, а затем

>>> from myModule.subModule import MyClass
>>> MyClass.kind
'first'

и в другом терминале

$ cat >myModule/subModule.py
class MyClass(object): kind='second'

тогда ...:

>>> import sys
>>> reload(sys.modules['myModule.subModule'])
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> from myModule.subModule import MyClass
>>> MyClass.kind
'second'

Вам нужно пройти через sys.modules, так как в противном случае у вас нет ссылки на подмодуль, а затем вам нужно повторить from.

Жизнь намного проще, если вы примете мудрый совет всегда импортировать модуль, конечно, никогда не загружайте из INSIDE модуля - например, сессия Python будет (с изменением в подмодуле до перезагрузки): *

>>> from myModule import subModule as sm
>>> sm.MyClass.kind
'first'
>>> reload(sm)
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> sm.MyClass.kind
'second'

Если вы привыкнете использовать квалифицированные имена, такие как sm.MyClass вместо только голого MyClass, ваша жизнь будет проще во многих отношениях (более простая перезагрузка - только одно из них; -).

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