У меня есть следующее дерево исходников:
planets/
earth.py
mars.py
util.py
main.py
Со следующим кодом:
planets / earth.py:
def moon() -> None:
print('moon')
planets / mars.py:
def phobos() -> None:
print('phobos')
util.py:
import planets.mars # yes, just this
main.py:
import planets.earth
import util
def foobar() -> None:
planets.mars.phobos()
if __name__ == '__main__':
foobar()
Обратите внимание, что в "main.py" я не указываю явноимпорт "planets.mars".Когда я запускаю «main.py», вместо того, чтобы получить ошибку, как я ожидал, я получаю вывод:
phobos
Мне кажется, что, поскольку я импортирую «planets.mars» в «util».py ", а затем я импортирую" util.py "в" main.py "," main.py "может видеть" planets.mars "и, таким образом, я могу вызвать" planets.mars.phobos () "из" main.py".
Однако, когда я удаляю" import planets.earth "из" main.py ", я получаю исключение" NameError: name 'planets' notfined "при попытке запустить" main.py ",Похоже, это указывает на то, что «planets.mars», транзитивно импортируемый в «main.py» путем импорта в «util.py», - это не то, что происходит, и в действительности происходит ошибка в моем интерпретаторе Python.
Может кто-нибудь пролить свет на эту загадку для меня?Я использую CPython версии 3.7.0 в Debian 9.
Спасибо!