|
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.
|
|