Введение в язык Питон

773123a3

Пакеты.


Несколько модулей в Питоне могут быть объединены по функциональному или какому-нибудь другому признаку. Для этого используются пакеты. Суть пакетов такова: вы объединяете несколько модулей по некому признаку в пакет, затем могут появиться другие пакеты с модулями, организовать структуру пакетов можно по принципу дерева. Принципу дерева подчиняются также папки в файловых системах. То есть пакеты подобны папкам на диске:

Sound/ Корневой пакет __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), так как в них не различается регистр у файлов и папок, а так как в Питоне регистр различается, то это может привести к непредсказуемым именам модулей(Echo, echo, ECHO, eChO). Поэтому для надёжности лучше создавать список модулей пакета в файле __init__.py. Для этого присвойте переменной __all__ список всех имён модулей(строковый тип элемента списка). Такой подход обеспечит корректную интерпретацию пакета на любой системе.

__all__ = ["echo", "surround", "reverse"]

А в самом коде можно теперь применять import *:

from Sound.Effects import *

А вообще, лучше импортировать из пакета только нужные модули: во-первых это удобно для понимания кода, а во-вторых куча модулей будет использовать кучу памяти – выбирать вам: или чуть больше написать руками и иметь меньше проблем, или наоборот...



Содержание раздела