Я смущен тем, как области и пространства имен определены в Python. Предполагая, что у меня есть файловая система:
|-test1.py
-test2.py
Каждый файл определяется следующим образом:
test1.py:
#!/usr/bin/python
def test1():
print('test1')
test2.py:
#!/usr/bin/python
from test1 import test1
def test2():
test1()
print('test2')
В интерактивном интерпретаторе python, если я делаю следующее:
import test2
test2.test2()
код будет работать нормально и даст следующий результат:
test1
test2
На выходе мы видим, что интерпретатор может правильно идентифицировать объект функции test1(). Что меня смущает, когда test1.test1 импортируется во время выполнения? Когда этот объект переходит в глобальную область?
Основываясь на ответе @Ziyad Edher, я создал диаграмму Венна, чтобы проиллюстрировать взаимосвязь разных областей. Предположим, что интерпретатор заменен третьим файлом test3.py. Области их действия следующие: Круг представляет область действия, File test3
относится к test3.py
, File test2
относится к test2.py
, test2()
относится к функции test2()
в test2.py
, test1()
ссылается к функции test1()
в test1.py
. Объем test2()
не имеет test1()
, поэтому интерпретатор будет ссылаться на область File test2
уровня 2 верхнего уровня. В File test2
есть test1()
и вызывает его.
Импорт модулей Python и глобальное управление пространством имен - очень широкая тема, поэтому я ограничу этот ответ конкретным случаем, который вы видите.
В общем, Python работает очень последовательно.
import test2
, это идет в файл test2.py
в локальном каталоге и выполняет этот файл в той же среде Python.test2.py
, Python сталкивается from test1 import test1
.test1.py
, он делает некоторые дополнительные вещи, потому что вы импортируете функцию в модуле, а не сам модуль, но в целом на данный момент test1
(функция) помещается в текущий объем.test2.test2()
, так как test2
был импортирован на шаге 2, он существует и test2.test2
. Таким образом, интерпретатор переходит к test2.test2
и test2.test2
test1
и поскольку он находится в пространстве имен (мы просто импортировали его на шаге 3), ошибка не возникает, тогда вызывается второй оператор печати.На нижнем уровне ситуация, очевидно, немного сложнее, но это дает общий обзор того, как Python занимается этим материалом.
test1
входит в область действия модуля / файла test2
, а не в область действия test2
. Если файл python импортируется как модуль, то сначала выполняются команды импорта над всеми классами / функциями в этом файле. Правильно ли мое понимание?
test1
доступен только в рамкахtest2
поскольку именно там он импортируется.