2016-01-10 4 views
2

Если я делаю test_folder.__init__, который состоит из:доступа модули, импортированные в __init__ без непосредственного обращения к ним

constant1 = 1 
from test_folder import moduleVar1 

, а затем из родительского каталога, запустите следующий сценарий:

import sys 
from test_folder import constant1 
print(constant1) 
print(sys.modules) 

sys.modules говорит мне это test_folder.moduleVar1 был импортирован.

Выход из sys.modules:

'test_folder.moduleVar1': <module 'test_folder.moduleVar1' from 'C:...\test_folder\moduleVar1.py'> 

Почему этот модуль показан как импортирован, когда я не указал его импортировать?

+0

Я думаю, что все делается автоматически. Каждый раз, когда любой код Python изменяется и сохраняется, он перекомпилируется. Вы можете сделать несколько тестов, например, добавить 'print', чтобы проверить, что' db_migrate.py' принимает обновленные модели или нет – Valijon

+0

Я думаю, что этот ответ удовлетворяет вашему вопросу [http://stackoverflow.com/a/8502348/3710490](http: //stackoverflow.com/a/8502348/3710490) – Valijon

ответ

2

Что вы видите, выглядит правильно. Вы не можете импортировать только одну переменную. Весь модуль __init__ будет импортирован вместе с дополнительным импортом. Обратите внимание, что sys.modules не указывает, что что-то было импортировано в текущее пространство имен и не имеет никакого отношения к текущему пространству имен. По сути, sys.modules - это глобальный словарь (или кеш), который Python использует для уверенности в том, что если вы импортируете модуль более одного раза или ссылаетесь на его подмодули, то ему не нужно перезагружать модуль и чтобы он не загружал тот же модуль из двух разных мест.

Итак, если модуль загружен в любом месте в любом из модулей или библиотек, к которым обращается ваш код, он останется в sys.modules после этого.

Таким образом, в главной рутине, когда вы говорите:

import sys 
from test_folder import constant1 

Он загружает __init__ для того, чтобы получить доступ к constant1, но так как __init__ коду также импортирует moduleVar1, питон сделает запись в sys.modules как запись записи, даже если она не импортирована в ваш основной модуль, поэтому вы увидите остаточную запись, если вы распечатаете sys.modules.

Смежные вопросы