Лутц передает приветВ обеих версиях, Python 3.0 и 2.6, инструкции from теперь могут использовать
точки («.»), чтобы указать, что поиск модулей в первую очередь должен про-изводиться в том же самом пакете (эта особенность известна как импортирование относительно пакета), а не где-то в другом месте, в пути поиска (эта особенность называется импортирование по абсолютному пути). То есть:
• В обеих версиях Python, 3.0 и 2.6, в инструкции fromв начале пути мож-но использовать точки, чтобы указать, что импорт должен производиться
относительновмещающего пакета, – при таком способе импортирования
поиск модулей будет производиться только внутри пакета, а модули с теми
же именами, находящиеся где-то в пути поиска (sys.path), будут недоступны. Благодаря этому модули внутри пакета получают преимущество перед
модулями за его пределами.
• В Python 2.6 обычная операция импортирования в программном коде пакета (без точек) в настоящее время по умолчанию выполняется в порядке
«сначала поиск относительно пакета, потом – абсолютный поиск». То есть
поиск сначала производится в каталоге пакета и только потом в пути поиска. Однако в Python 3.0 по умолчанию выполняется импортирование по абсолютному пути – при отсутствии точек операции импортирования пропускают вмещающий пакет и пытаются отыскать импортируемые модули
в пути поиска sys.path.
Например, в обеих версиях Python, 3.0 и 2.6, инструкция вида:
from . import spam # Импортирование относительно текущего пакета
предписывает интерпретатору импортировать модуль с именем spam, расположенный в том же пакете, что и файл, где находится эта инструкция. Аналогично, следующая инструкция:
означает: «из модуля с именем spam, расположенного в том же пакете, что
и файл, где находится эта инструкция, импортировать переменную name».
Поведение инструкции безначальной точки зависит от используемой версии
Python. В версии 2.6 такая инструкция импортирования по умолчанию также
будет использовать порядок поиска «сначала относительно пакета, а затем – абсолютный поиск» (то есть сначала поиск выполняется в каталоге пакета), если
только в импортирующий файл не будет включена следующая инструкция:
from __future__ import absolute_import # Обязательно до версии2.7?
Если эта инструкция присутствует, она включает использование абсолютного
пути поиска, которое по умолчанию используется в Python 3.0.
В Python 3.0 все операции импортирования без дополнительных точек никогда
не пытаются отыскать модуль внутри пакета и производят поиск по абсолютно-му пути, хранящемуся в списке sys.path. Например, когда задействован меха-низм импортирования в версии 3.0, следующая инструкция всегда будет нахо-дить не модуль stringв текущем пакете, а одноименный модуль в стандартной библиотеке:
import string # Пропустит поиск модуля в пакете
Без инструкции from __future__ в Python 2.6 всегда будет импортироваться модуль string из пакета. Чтобы получить то же поведение в версии 3.0 и 2.6, ког-да по умолчанию выполняется импорт по абсолютному пути, для выполнения
операции импортирования относительно пакета можно использовать следую-щую форму инструкции:
from . import string # Поиск выполняется только в пределах пакета
На сегодняшний день этот прием работает в обеих версиях Python, 2.6 и 3.0.
Единственное отличие модели импортирования в версии 3.0 состоит в том, что
она является обязательной, когда требуется по простому имени загрузить модуль, находящийся в том же каталоге пакета, что и файл, откуда производится
импортирование.
Обратите внимание: ведущий символ точки может использоваться только в ин-струкции from – в инструкции importон недопустим. В Python 3.0 инструкция
import modnameвсегда выполняет импортирование по абсолютному пути, пропу-ская поиск в каталоге пакета. В Python 2.6 она по-прежнему выполняет импорт
по относительному пути (то есть сначала она просматривает каталог пакета),
но в Python 2.7 она будет выполнять импорт по абсолютному пути. Инструкции fromбез ведущей точки ведут себя точно так же, как инструкции import, – в версии 3.0 они выполняют импортирование по абсолютному пути (пропуская
каталог пакета), а в версии 2.6 они выполняют поиск «сначала относительно
пакета, а затем – абсолютный поиск» (поиск в каталоге пакета выполняется
в первую очередь).
Возможны также и другие варианты точечной нотации для ссылки на модули
в пакете. Допустим, что имеется каталог mypkg пакета, тогда следующие аль-
Импортирование относительно пакета
тернативные варианты импортирования внутри этого пакета будут работать
так, как описывается:
from .string import name1, name2 # Импорт имен из mypkg.string
from . import string # Импорт mypkg.string
from .. import string # Импорт string из родительского каталога