- Часть I. Вводное руководство
- Глава 2. Использование интерпретатора
- 2.2. Интерпретатор и его среда
- 6.6.1. Импортирование всего содержимого пакета (модуля)
6.6.1. Импортирование всего содержимого пакета (модуля)
Что же происходит, когда пользователь использует 'from Sound.Effects import *' ? В идеале, интерпретатор должен каким-либо образом обойти файлы, находящиеся в каталоге пакета, и импортировать их все. К сожалению, такой подход не будет работать достаточно хорошо на таких платформах, как Macintosh и Windows, где файловая система не всегда имеет точную информацию о регистре букв в именах файлов. В этом случае нет надежного пути узнать, с каким именем должен быть импортирован файл с именем 'ECHO.PY': echo, Echo или ECHO.
Единственный выход для автора — снабдить пакет явным указателем его содержимого. Инструкция import использует следующее соглашение: если в инициализационном файле '__init__.py' определён список с именем __all__, он используется в качестве списка имён модулей, которые должны импортироваться при использовании 'from package import *'. Поддержка этого списка в соответствии с текущим составом пакета возлагается на автора. Можно также не определять список __all__, если авторы не считают уместным импортирование *. Например, файл 'Sounds/Effects/__init__.py' может содержать следующий код:
__all__ = ["echo", "surround", "reverse"]
Это означает, что from 'Sound.Effects import *' импортирует три указанных модуля из пакета Sound.
Если список __all__ не определён, 'from Sound.Effects import *' не будет импортировать все модули пакета Sound.Effects, а только имена, явным образом определ`нные в инициализационном файле '__init__.py' (включая явно импортированные в нём модули). Кроме того, в текущую область видимости попадут модули пакета, явно загруженные предыдущими инструкциями import, например:
import Sound.Effects.echo
import Sound.Effects.surround
from Sound.Effects import *
В приведённом примере, модули echo и surround импортируются в текущее пространство имён, потому что они уже определены в пакете Sound.Effects на момент выполнения инструкции from ... import.
Заметим, что импортирование всех имён, определённых в модуле или пакете, обычно приводит к засорению пространства имен и, как результат, к возможным конфликтам. (Некоторые модули специально спроектированы таким образом, чтобы экспортировать только имена, следующие определенному шаблону.) Кроме того, при этом глобальные переменные модуля становятся доступными только для чтения — при попытке присвоить такой переменной новое значение Вы создадите новую (локальную) переменную с таким же именем. А все изменения, внесённые в глобальные переменные модуля после его инициализации, не будут видны за его пределами.
Мы рекомендуем стараться использовать запись 'from package import specific_module', за исключением случаев, когда необходимо использовать модули с одинаковыми именами из разных пакетов.