SAMOUCZEK JĘZYKA PYTHON ROZDZIAŁY   
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.
Strona główna - O Pythonie - Interpreter - Samouczek - Przykłady programów - Linki