При импорте модуля из пакета пакет всегда импортируется (загружается, если его еще нет в sys.modules
), что может иметь побочный эффект связывания имени пакета в модуле импорта, хотя это не (зависит от реализации и версии Python).
И, импортируя что-то «изнутри модуля» (практика, которую я лично ненавижу, но это еще одна проблема), необходимо также обеспечить загрузку модуля (если он уже находится в sys.modules
, его, разумеется, не нужно снова загружать , но если это не так, он должен быть загружен и помещен в sys.modules
).
Оба эти поведения (гарантированные части ;-) все о «целостности» пакетов и модулей: когда вы пишете модуль вы можете быть уверены, что, даже если кто-то ошибочно пытается выбрать, какие биты для импорта, они будут влиять только на привязки имен в их собственном модуле, но ваш модуль всегда будет загружен в целом. И аналогично для кого-то, кто импортирует модуль из вашего пакета (совершенно нормальная практика, BTW): вы знаете ваш пакет __init__.py
будет загружен первым, прежде чем что-нибудь случится. Это дает вам возможность сделать все необходимые проверки и инициализации, конечно!
Спасибо за ответ. Вы знаете, где я могу найти дополнительную информацию о «побочном эффекте»? Я сделал поиск в Google, но не смог получить полезный результат. – sayap
учебник по импорту по адресу http://effbot.org/zone/import-confusion.htm (не распространяется на пакеты и '__init __. Py'), официальный учебник по адресу http://docs.python.org/tutorial/modules.html. –