Пакеты.
Несколько модулей в Python могут быть
объединены по функциональному или какому-нибудь другому признаку. Для этого
используются пакеты. Суть пакетов такова: вы объединяете несколько модулей по
некому признаку в пакет, затем могут появиться другие пакеты с модулями, организовать
структуру пакетов можно по принципу дерева. Принципу дерева подчиняются также
папки в файловых системах. То есть пакеты подобны папкам на диске:
__init__.py Инициализация звуковой библиотеки
Formats/
Подпакет звуковых форматов
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
Effects/
Подпакет звуковых эффектов
__init__.py
echo.py
surround.py
reverse.py
...
Filters/ Подпакет фильтров
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
Файл __init__.py нужен интерпретатору для того, чтобы расценивать
каталог на диске, как пакет. Данный файл может быть пустым, но может содержать
исполняемый код, для инициализации переменной __all__.
Из пакетов можно импортировать
отдельные модули несколькими путями:
1. import Sound.Effects.echo
Загрузка модуля echo. Далее должно указываться полное имя модуля:
Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)
2. from Sound.Effects import echo
Также загрузка модуля echo, но теперь к нему
можно обращаться без указания имени модуля:
echo.echofilter(input, output, delay=0.7, atten=4)
3. from Sound.Effects.echo import echofilter
Прямой импорт объекта из пакета.
Теперь вы можете обращаться к функции echofilter() непосредственно через её имя:
echofilter(input, output, delay=0.7, atten=4)
Из пакетов можно также
импортировать все модули. Но трюк с import * не пройдёт на некоторых операционных системах(DOS, Windows, MAC), так как в них не
различается регистр у файлов и папок, а так как в Python регистр различается, то это может привести к
непредсказуемым именам модулей(Echo, echo, ECHO, eChO). Поэтому для надёжности лучше создавать список
модулей пакета в файле __init__.py. Для этого присвойте переменной __all__ список всех имён
модулей(строковый тип элемента списка). Такой подход обеспечит корректную
интерпретацию пакета на любой системе.
__all__ = ["echo", "surround", "reverse"]
А в самом коде можно теперь
применять import *:
from Sound.Effects import *
А вообще, лучше импортировать из
пакета только нужные модули: во-первых это удобно для понимания кода, а
во-вторых куча модулей будет использовать кучу памяти – выбирать вам: или чуть
больше написать руками и иметь меньше проблем, или наоборот...