Базовая инструкция import
, без оператора from
, выполняется в два этапа:
import
.Когда инструкция import
содержит несколько имен модулей, разделенных запятыми, эти два шага выполняются отдельно для каждого имени, как если бы предложения были разделены на отдельные операторы импорта.
Поиск и загрузка модулей более подробно описаны во встроенной функции __import__
, а также в материалах раздела "Система импорта в Python". Обратите внимание, что ошибки на этом шаге могут указывать либо на то, что модуль не удалось найти, либо на то, что произошла ошибка при инициализации модуля, которая включает в себя выполнение кода модуля.
Если запрошенный модуль будет успешно найден и загружен, он будет доступен в локальном пространстве имен одним из трех способов:
as
, то имя следующее за as
привязывается непосредственно к импортированному модулю.Конструкция импорта с инструкцией from
использует несколько более сложный процесс:
from
, загрузка и инициализация его при необходимости.import
:ImportError
.import
, сохраняется в локальном пространстве имен с использованием имени в предложении as
, если оно присутствует, в противном случае используется имя атрибута модуля.# foo импортируется и привязывается локально import foo # foo.bar.baz импортируется, foo привязывается локально import foo.bar.baz # foo.bar.baz импортируется и связывается как fbb import foo.bar.baz as fbb # foo.bar.baz импортируется и связывается как baz from foo.bar import baz # foo импортируется и foo.attr связывается как attr from foo import attr
Если список идентификаторов заменяется звездочкой '*'
, все публичные имена, определенные в модуле, связываются в локальном пространстве имен для области, в которой выполняется оператор import
.
Публичные имена модуля, определяются путем проверки пространства имен модуля на наличие переменной с именем __all__
. Если __all__
определена, то это должна быть последовательность строк, которые являются именами, определенными или импортированными этим модулем. Имена, приведенные в переменной с именем __all__
, считаются общедоступными и должны существовать. Если __all__
не определена, то набор публичных имен включает все имена, найденные в пространстве имен модуля, которые не начинаются с символа подчеркивания '_'
. Переменная __all__
должна содержать весь открытый API модуля. Она предназначена для того, чтобы избежать случайного экспорта элементов, которые не являются частью API, например библиотечных модулей, которые были импортированы и использованы в модуле.
Подстановочная форма импорта from module import *
(со звездочкой) допускается только на уровне модуля. Попытка использовать его в определениях классов или функций вызовет исключение SyntaxError
.
При указании модуля для выполнения импорта из пакета, не обязательно указывать абсолютное имя модуля в точечной нотации. Если модуль или пакет содержится в другом пакете, то можно выполнить относительный импорт в том же самом верхнем пакете без необходимости упоминания имени пакета. Используя начальные точки в указанном модуле или пакете после инструкции from
, можно указать, как высоко будет проходить текущая иерархия пакетов без указания точных имен. Одна ведущая точка означает текущий пакет, в котором находится модуль, производящий импорт. Две точки означают один уровень выше. Три точки - это два уровня вверх и т. д.
Так что если вы выполняете from . import mod
из модуля в пакете pkg
, тогда вы в конечном итоге импортируете pkg.mod
. Если вы выполняете from ..subpkg2 import mod
из pkg.subpkg1 вы импортируете pkg.subpkg2.mod. Спецификация для относительного импорта содержится в материале "Относительный импорт пакетов".
importlib.import_module()
предоставляется для поддержки приложений, которые динамически определяют модули для загрузки.