В Python REPL, как получить последний код из всего файла?

У меня есть следующий код игрушки в двух файлах:

Файл b.py:

def test_b():
    print "b"

Файл a.py: из b импортировать test_b

def test_a():
    print "a"
    test_b()

Затем я запускаю python REPL:

>>> execfile("a.py")
>>> test_a()
a
b

Затем я изменяю b.py на: def test_b(): print "bb"

И запустить в REPL:

>>> execfile("b.py")
>>> test_a()
a
bb

На данный момент все в порядке. Теперь я изменяю a.py на:

from b import test_b

def test_a():
    print "aa"
    test_b()

Теперь я запускаю REPL:

>>> execfile("a.py")
>>> test_a()
aa
b

Что уже не нормально, так как REPL получил более старую версию b.py. Кажется, что Python выполняет некоторое кэширование при загрузке файлов, и мой вопрос: есть ли способ заставить его не делать этого? Я не смог найти подходящий вариант для функции excefile.


person S4M    schedule 30.10.2015    source источник
comment
Полезен ли этот ответ на ваш вопрос? stackoverflow.com/a/2918951/758446   -  person BlackVegetable    schedule 30.10.2015
comment
@BlackVegetable выглядит так, спасибо. Я собираюсь проверить это сейчас.   -  person S4M    schedule 30.10.2015


Ответы (1)


Согласно: https://docs.python.org/2/tutorial/modules.html вы можете использовать reload(a) (она должна быть импортирована ранее). Смотрите описание, возможно, это не лучшее решение.

Цитата:

Примечание

Из соображений эффективности каждый модуль импортируется только один раз за сеанс интерпретатора. Поэтому, если вы меняете свои модули, вы должны перезапустить интерпретатор — или, если вы хотите протестировать только один модуль в интерактивном режиме, используйте reload(), например перезагрузить (имя модуля).

и описание функции: https://docs.python.org/2/library/functions.html#reload использовать с модерацией, поскольку:

Если модуль импортирует объекты из другого модуля, используя from ... import ..., вызов reload() для другого модуля не переопределяет импортированные из него объекты — один из способов обойти это — повторно выполнить оператор from, другой — вместо этого использовать импортированные и уточненные имена (module.name).

Самое простое решение — перезапустить интерпретатор.

person Dese    schedule 30.10.2015