Как к модулю "reimport" к python, после чего код будет изменен после импорта - программирование
Подтвердить что ты не робот

Как к модулю "reimport" к python, после чего код будет изменен после импорта

У меня есть foo.py

def foo():
    print "test"

В IPython я использую:

In [6]:  import foo
In [7]:  foo.foo()
test

Затем я изменил foo() на:

def foo():
    print "test changed"

В IPython результат для вызова по-прежнему test:

In [10]:  import foo
In [11]:  foo.foo()
test

Затем я использую:

In [15]: del foo
In [16]:  import foo
In [17]:  foo.foo()
test

Я удаляю foo.pyc в ту же папку foo.py, но все равно не повезло.

Могу ли я узнать, как reimport обновленный код во время выполнения?

4b9b3361

Ответ 1

foo = reload(foo)

Ответ 2

В дополнение к ответу gnibbler:

Это изменилось в Python 3 на:

>>> import imp
>>> imp.reload(foo)

Как указывает @onnodb, imp устарел в пользу importlib, поскольку Python 3.4:

>>> import importlib
>>> importlib.reload(foo)

Ответ 3

IPython3 autoreload работает правильно.

Я использую фактический пример с веб-страницы. Сначала загрузите функцию автозагрузки.

In []: %load_ext autoreload
In []: %autoreload 2

Затем импортируйте модуль, который вы хотите проверить:

In []: import foo
In []: foo.some_function()
Out[]: 42

Откройте foo.py в редакторе и измените функцию some_function, чтобы вернуть 43

In []: foo.some_function()
Out[]: 43

Он также работает, если вы импортируете функцию напрямую.

In []: from foo import some_function
In []: some_function()
Out[]: 42

Внесите изменения в some_function, чтобы вернуть 43.

In []: some_function()
Out[]: 43

Ответ 4

Если вы хотите, чтобы это произошло автоматически, есть модуль autoreload, который поставляется с iPython.