Как Python «импорт» работает внутри? - PullRequest
3 голосов
/ 02 декабря 2011

Когда вы импортируете модуль, затем снова импортируете его, он будет повторно импортирован / перезаписан или пропущен? Что произойдет, когда вы импортируете модули "a" и "b", но также импортируете модуль "b" в модуль "a"? Безопасно ли это делать? Например, если в модуле "b" создан экземпляр класса, вы в конечном итоге создадите его дважды?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

import загружает соответствующий файл .py, .pyc или .pyo, создает объект модуля и сохраняет его со своим полностью определенным ("точечным") именем в словаре sys.modules.Если секунда import найдет модуль для импорта в этом словаре, он вернет его без повторной загрузки файла.

Чтобы ответить на ваши вопросы:

При импорте модуля, а затем снова импортируйте его, будет ли он повторно импортирован / перезаписан или пропущен?

Он будет пропущен.Чтобы явно повторно импортировать модуль, используйте встроенную функцию reload().

Когда вы импортируете модуль "a" и "b", но также имеете модуль "b", импортированный в модуль "a ", что происходит?

import a загрузит a из a.py[c], import b вернет модуль sys.modules['b'], уже загруженный a.

Безопасно ли это делать?

Да, абсолютно.

Например, если в модуле "b" создан экземпляр класса, выв конечном итоге создать его дважды?

Нет.

3 голосов
/ 02 декабря 2011

Модуль будет создан только один раз.Можно безопасно импортировать один и тот же модуль в несколько других модулей.Если есть экземпляр класса (объект), который создан в самом модуле, тот же объект будет доступен из всех импортирующих его модулей.

Вы можете, если хотите, просмотреть все импортированныеmodules:

import sys
print sys.modules

sys.modules - это словарь, который отображает имена модулей для объектов модуля.Первое, что делает оператор импорта, ищет в sys.modules, если он не может найти там модуль, он будет создан и добавлен в sys.modules для будущего импорта.http://effbot.org/zone/import-confusion.htm (см. «Что делает Python для импорта модуля?»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...