Области Python и пространства имен импортируемых модулей

1

Я смущен тем, как области и пространства имен определены в 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() и вызывает его.

Изображение 174551

  • 0
    test1 доступен только в рамках test2 поскольку именно там он импортируется.
  • 0
    если вы обычно принимаете исчерпывающий ответ, приведенный ниже, нажмите зеленый значок «галочка», показанный слева от ответа, чтобы принять его и создать более вдохновляющее сообщество с открытым исходным кодом.
Теги:
scope
namespaces

1 ответ

1
Лучший ответ

Импорт модулей Python и глобальное управление пространством имен - очень широкая тема, поэтому я ограничу этот ответ конкретным случаем, который вы видите.

В общем, Python работает очень последовательно.

  1. Вы открываете интерпретатор, некоторые специальные значения, такие как переменная среды и другие переменные ядра, вводятся в глобальное пространство имен.
  2. Вы выполняете import test2, это идет в файл test2.py в локальном каталоге и выполняет этот файл в той же среде Python.
  3. Выполняя test2.py, Python сталкивается from test1 import test1.
  4. Подобно шагу 2, Python идет и находит test1.py, он делает некоторые дополнительные вещи, потому что вы импортируете функцию в модуле, а не сам модуль, но в целом на данный момент test1 (функция) помещается в текущий объем.
  5. Вы вызываете test2.test2(), так как test2 был импортирован на шаге 2, он существует и test2.test2. Таким образом, интерпретатор переходит к test2.test2 и test2.test2 test1 и поскольку он находится в пространстве имен (мы просто импортировали его на шаге 3), ошибка не возникает, тогда вызывается второй оператор печати.

На нижнем уровне ситуация, очевидно, немного сложнее, но это дает общий обзор того, как Python занимается этим материалом.

  • 0
    Таким образом, функция test1 входит в область действия модуля / файла test2 , а не в область действия test2 . Если файл python импортируется как модуль, то сначала выполняются команды импорта над всеми классами / функциями в этом файле. Правильно ли мое понимание?
  • 0
    Да это верно. Ничего особенного в том, что они импортируются, просто Python выполняет самый верхний слой файла сверху вниз. Следовательно, почему мы обычно помещаем импорт сверху (чтобы он мог быть импортирован прежде, чем что-либо еще может работать).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню