Импорт модуля из самого модуля в Python

215 просмотра
0
0 Комментариев

#файл cf.py
a=1
b=2
c=3
import cf
print(cf.a, cf.b, cf.c)

Модуль импортирует себя для доступа к переменным через его атрибуты.
Во-первых, почему операция импортирования в этом модули не зацикливается(модуль импортирует сам себя) по сути интерпретатор не должен дойти до инструкции print

Во-вторых, почему при импортировании модуля из самого модуля, в IDLE инструкция print срабатывает 2 раза(т.е ответ — 123 123), а при запуске в консоли 1 раз.


Добавить комментарий

1 Ответы

Python Опубликовано 12.12.2018
0

Дело в том, что в питоне есть такая штука — sys.modules. Когда ты вызываешь import (по сути это обращение к функции __import__()), модуль, который ты импортируешь (или из которого импортируешь) исполняется через exec в отдельном неймспейсе и добавляется в словарь sys.modules. НО! Так происходит только и только в том случае, если имя модуля ещё отсутствует в данном словаре. А теперь проведём небольшой эксперимент. Есть такая системная переменная в питоне — __name__. Давайте выведем её сразу после строки с цифрами:

print(cf.a, cf.b, cf.c)
print(__name__)

И вот что мы получим:

>>>
1 2 3
cf
1 2 3
__main__

Это не удивительно. Потому что любой вызываемый модуль по умолчанию называется не именем файла или пакета, а именно __main__. Соответственно, когда программа натыкается на импорт данного модуля, в словаре sys.modules пока ещё нет модуля под названием cf (зато есть модуль под названием __main__, но это не так важно). Но вот когда программа натыкается на импорт во второй раз, ей уже нет нужды прогонять файл cf.py через exec, потому что в словаре sys.modules уже есть ключ с названием cf, значением которого является, собственно, объект модуля.

А вот как это у тебя получилось, что в консоли он выводит цифры только один раз, я не знаю. Покажи как исполняешь, что ли.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up