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 7: Importowanie * z pakietu


A teraz, co się stanie, kiedy użytkownicy napiszą from Sound.Effects import *? Ktoś mógłby pomyśleć naiwnie, że ta instrukcja w jakiś sposób wychodzi do systemu plików, znajduje wszystkie pliki z modułami składowymi, które są obecne w pakiecie-katalogu i wszystkie je importuje. Niestety, taka operacja nie działa zbyt dobrze na macintosh'ach i w Windows, gdzie system plików nie zawsze wyposażony jest w dokładną informację na temat wielkości liter w nazwach! Na tych platformach nie ma sposobu dowiedzenia się, czy plik ECHO.PY powien być zaimportowany jako moduł echo, Echo czy ECHO (np. Windows 95 ma denerwujący zwyczaj pokazywania nazw plików z pierwszą dużą literą). Ograniczenie DOS-a (8+3 znaki na nazwę pliku) dodaje jeszcze jeden interesujący problem do tej listy jeżeli chodzi o długie nazwy modułów.

Jedynym wyjściem dla autora takiego pakietu jest dostarczenie wprost indeksu jego części składowych. Instrukcja importu posługuje się następującą konwencją: jeżeli kod pakietu __init__. py zdefiniuje listę o nazwie __all__, to przyjmuje się, że zawiera ona nazwy wszystkich modułów importowanych za pomocą instrukcji from pakiet import *. Zadaniem autora pakietu jest utrzymywanie stanu tej listy na bieżąco, w chwili gdy wypuszczane są nowe wersje pakietu. Autorzy pakietów mogą również nie dostarczać tej listy, jeśli nie widzą sensu z importowania * z ich pakietu. Na przykład plik Soundffects/__init__.py mógłby zawierać następujący kod:

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

Znaczyłoby to, że from Sound.Effects import * zaimportuje trzy moduły składowe z pakietu Sound.

Jeśli__all__ nie jest zdefinowana, instrukcja from Sound.Effects import * nie zaimportuje wszystkich modułów składowych z pakietu Sound.Effects do bieżącej przestrzeni nazw: upewni się tylko, czy pakiet Sound.Effects został zaimportowany (z możliwym wykonaniem kodu z pliku __init__.py) a potem zaimportuje wszystkie nazwy zdefiniowane w tym pakiecie. Wchodzą w nie nazwy zdefiniowane (i moduły składowe załadowane wprost) w pliku __init__.py oraz moduły składowe pakietu załadowane wprost przez poprzednie instrukcje importu, tzn.

import Sound.Effects.echo
import Sound.Effects.surround
from Sound.Effects import *

W tym przykładzie moduły echo i sorround importowane są do bieżącej przestrzeni nazw ponieważ są zdefiniowane w pakiecie Sound.Effects, gdy wykonywany jest from...import (działa to również, gdy zdefiniowano __all__).
Trzeba tu zauważyć, że stosowanie importowania * z modułu lub pakietu idzie powoli w odstawkę, ponieważ często powoduje nieczytelny kod. Jest oczywiście w porządku, gdy stosuje się tę formułę, aby zaoszczędzić trochę na klepaniu klawiszami w trybie interaktywnym i gdy pewne moduły są zaprojektowane tak, że eksportują tylko nazwy odpowiadające pewnym schematom.
Trzeba pamiętać, że nie ma nic złego w używaniu formuły from Pakiet import pewien_modul! Właściwie, ta notacja jest zalecana, chyba że moduł importujący używa modułów składowych o takiej samej nazwie z paru różnych pakietów.

Strona główna - O Pythonie - Interpreter - Samouczek - Przykłady programów - Linki