Должен ли я перезагрузить модуль в Python, чтобы захватить изменения - PullRequest
0 голосов
/ 10 мая 2018

Я бегу python 3.6.4 (анаконда, спайдер).

Нужно ли перезагрузить пользовательский модуль, чтобы зафиксировать изменения?

Например, предположим, что я написал простую функцию и сохранил ее в test.py файле:

def plus5(x):
    return x + 5

Затем в IPython консоли я набираю

import test as t

и затем я изменяю пользовательскую функцию на:

def plus5(x):
    return x + 500

Затем, когда я набираю IPython console

t.plus5(0) it returns 500 without re-import или перезагрузите модуль первым.

Если я изменю имя функции с «плюс5» на другое, то мне придется повторно импортировать модуль, чтобы увидеть это изменение. Но когда я изменяю операторы функции, он автоматически фиксирует изменения без повторного импорта модуля

Из документации по Python: «Примечание. Из соображений эффективности каждый модуль импортируется только один раз за сеанс интерпретатора. Поэтому, если вы меняете свои модули, вы должны перезапустить интерпретатор - или, если это только один модуль, который вы хотите протестировать в интерактивном режиме, используйте importlib.reload(),

например. import importlib; importlib.reload(modulename) ".

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Как объяснил Megalng , это встроенная функция интерпретатора IPython и по умолчанию интерпретатор Python необходимо использовать importlib для перезагрузки модуля. Здесь по умолчанию выполняется интерпретатор Python,

Python 3.6.2 (default, Sep  5 2017, 17:37:49) 
[GCC 4.6.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> 
>>> import test as t
>>> t.plus5(0)
5
>>>   
>>> 
>>> #Changed function body to return x + 500    
... 
>>> t.plus5(0)
5
>>> import test as t
>>> t.plus5(0)   
5
>>> #It had no affect, even importing again doesn't work.
... 
>>> import importlib; importlib.reload(t)         
<module 'test' from '~/test.py'>
>>> 
>>> t.plus5(0)
500
>>> #Now it works !
... 
>>> 

Как видите, даже после изменения тела функции на return x + 500 он все равно сгенерировал результат 5 для t.plus5(0), даже повторный импорт тестового модуля не помог. Он только начал работать, когда importlib использовался для перезагрузки тестового модуля.

0 голосов
/ 10 мая 2018

Это функция в имени интерпретатора IPython autorealod. Он имеет магическую команду %autoreload, которая позволяет активировать или деактивировать эту функцию. Кажется, он включен по умолчанию, но я не смог найти что-то, что могло бы доказать это.

...