|
Rozdział 5: Moduły
1: Co to jest moduł?
- 2: Ścieżka poszukiwań modułów
- 3: Skompilowane pliki Pythona
- 4: Moduły standardowe
5: Funkcja dir()
- 6: Pakiety
- 7: Importowanie * z pakietu
- 8: Odniesienia pomiędzy pakietami
Lekcja 6: Pakiety
Pakiety są sposobem na "ustrukturalnienie" przestrzeni nazw modułów Pythona poprzez
używanie "kropkowanych nazw modułów". Na przykład, nazwa modułu A.B oznacza moduł składowy
"B" pakietu "A". Tak samo jak używanie modułów zaoszczędza autorom różnych modułów martwienia
się o konflikt nazw globalnych, tak samo używanie kropkowanych nazw modułów zaoszczędza autorom
wielomodułowych pakietów jak NumPy lub Python Imaging Library martwienia się nazwy swoich
modułów.
Załóżmy, że chce się zaprojektować zbiór modułów ("pakiet") służący do jednolitej obsługi
plików i danych dźwiękowych. Istnieje mnóstwo formatów zapisu dźwięku (zwykle rozpoznawane po
rozszerzeniu plików, np. .wav, .aiff, .au ), co spowoduje, że może będziesz musiał stworzyć i
utrzymywać zwiększającą się kolekcję modułów konwersji pomiędzy różnymi formatami plików. Jest
również dużo różnych operacji, które można przeprowadzić na danych dźwiękowych (np. miksowanie,
dodawanie pogłosu, zastosowanie funkcji equalizera, tworzenie sztucznego efektu stereo), tak
więc, kończąc już, będziesz pisał niekończący się strumień modułów do wykonywania tych operacji.
Poniżej przedstawiono jedną z możliwych struktur takiego pakietu (wyrażona ona jest w postaci
hierarchicznego drzewa, na podobieństwo systemu plików):
Sound/ Pakiet szczytowy
__init__.py Inicjalizacja pakietu do obsługi dźwięku
Formats/ Moduły składowe do konwersji plików
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
Effects/ Pakiet składowy z efektami dźwiękowymi
__init__.py
echo.py
surround.py
reverse.py
...
Filters/ Pakiet składowy z operacjami filtrowania
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
Plik __init__.py są wymagane, aby zmusić Pythona do traktowania katalogów jako zawierające
pakiety. Jest to konieczne, aby uchronić katalogi z powszechnie spotykanymi nazwami, takie jak
"string", od niezamierzonego ukrycia poprawnych modułów, które pojawią się później na ścieżce
poszukiwań modułów. W najprostszym przypadku, plik __init__.py może być pustym plikiem, ale
może też zawierać pewien kod do wykonania, lub ustawiać wartość zmiennej__all__, opisaną
później.
Użytkownicy tego pakietu mogą importować poszczególne moduły, np.:
import Sound.Effects.echo
To spowoduje załadowanie modułu składowego Sound.Effects.echo. Później, trzeba używać go
za pomocą pełnej nazwy, tzn.
Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)
Alternatywnym sposobem importowania modułu składowego jest:
from Sound.Effects import echo
W ten sposób również załadujemy moduł składowy echo ale sprawimy, że dostępny jest z nazwą
niezawierającą nazwy pakietu rodzicielskiego:
echo.echofilter(input, output, delay=0.7, atten=4)
Inną wariacją na ten temat jest zaimportowanie wprost żądanej funkcji:
from Sound.Effects.echo import echofilter
W ten sposób ponownie ładujemy moduł składowy echo, lecz jego funkcja echofilter() jest dostępna
wprost:
echofilter(input, output, delay=0.7, atten=4)
Zauważ, że kiedy używa się from pakiet import element, element może być modułem składowym
(lub pakietem składowym) lub inną nazwą zdefiniowaną dla tego pakietu,, jak funkcja, klasa czy
zmienna. Instrukcja import najpierw sprawdza, czy element jest zdefiniowany w pakiecie; jeśli
nie, zakłada się, że jest to moduł i poczynione są starania o jego załadowanie. Jeśli nie
zostanie on znaleziony, zgłaszany jest wyjątek ImportError.
W przeciwieństwie do tego, jeśli używa się składni import
element.element_skladowy.kolejny_element_skladowy, każdy element z wyjątkiem ostatniego musi
być pakietem: ostatni element może być modułem lub pakietem ale nie klasą, funkcją lub zmienną
zdefiniowaną w poprzednim elemencie.
|
|