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 1: Co to jest moduł?


Jeżeli chcemy napisać dłuższy program najlepiej stworzyć skrypt. Używając edytora tekstów, przygotowujemy polecenia dla interpretera i uruchomiamy program z przygotowanym plikiem na wejściu. Dlaczego? Dlatego, że w chwili gdy zakończy się pracę w interpreterze Pythona i ponownie rozpocznie, wszystkie definicje (funkcje i zmienne) zostają utracone. Gdy program staje się dłuższy, zachodzi konieczność podzielenia go na kilka plików w celu łatwiejszei pielęgnacji (ang. maintenance) całości. Będziesz chciał również użyć funkcji, które właśnie napisałeś w paru innych programach bez potrzeby wklejania ich w każdy program z osobna.

Python wspomoże te działania poprzez umieszczanie definicji w pliku i używania ich w skrypcie lub w interaktywnej postaci interpretera. Taki plik nazywany jest modułem. Definicje z modułu mogą być importowane do innych modułów lub do głównego modułu (zestaw zmiennych, których używałeś w skrypcie wykonywanym na najwyższym poziomie i w trybie kalkulatora).

Moduł jest plikiem zawierającym definicje Pythona i jego instrukcje. Nazwa pliku jest nazwą modułu pozbawionego rozszerzenia .py. W module, nazwa modułu dostępna jest jako wartość zmiennej globalnej __name__.
Na przykład, użyj edytora tekstów i stwórz plik o nazwie fibo.py. Umieść go w bieżącym katalogu z następującą zawartością:

# Moduł liczb Fibonacciego
def fib(n): # wypisz ciąg Fibonacciego aż do n a, b = 0, 1 while b < n: print b, a, b = b, a+b
def fib2(n): # zwróć ciąg Fibonacciego aż do n wynik = [] a, b = 0, 1 while b < n: wynik.append(b) a, b = b, a+b return wynik

Po uruchomieniu interpretera Pythona można zaimportować ten moduł za pomocą następującego polecenia:

>>>import fibo

W ten sposób nazwy funkcji zdefiniowane w module fibo nie zostaną zaimportowane wprost do bieżącej tablicy symboli, tylko zostanie wprowadzona nazwa fibo. Aby dostać się do owych funkcji, trzeba użyć nazwy modułu :

>>>fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>>fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Jeżeli się często chce używać funkcji , można przypisać jej lokalną nazwę:
>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Moduł może zawierać instrukcje wykonywalne obok definicji funkcji. Instrukcje te mają na celu inicjalizację modułu i wykonywane są tylko w chwili importowania modułu po raz pierwszy, gdzieś w programie. Definicja funkcji jest także "insrukcją", która jest "wykonywana". Wykonanie to powoduje wprowadzenie nazwy funkcji do globalnej tablicy symboli modułu.

Każdy z modułów posiada swoją prywatną tablicę symboli, która używana jest przez wszystkie funkcje zdefiniowane w module jako globalna tablica symboli. W ten sposób, autor modułu może używać w nim zmiennych globalnych bez konieczności martwienia się o przypadkowy konflikt nazwy występującej w module z nazwą globalną zdefiniowaną w programie użytkownika. Z drugiej jednak strony można wpłynąć na globalną zmienną modułu za pomocą takiej samej notacji, jakiej użyliśmy poprzednio, aby użyć wprost nazwy funkcji z modułu: nazwa_modulu.nazwa_elementu.

Moduły mogą importować inne moduły. Zazwyczaj wszystkie instrukcje import umieszczane są na początku modułu (lub skryptu). Nazwy zaimportowanych modułów umieszczane są w globalnej tablicy symboli importujących modułów.

Istnieje wariant instrukcji import, która importuje nazwy z modułu wprost do tablicy symboli modułów importujących. Na przykład:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
Ta konstrukcja nie wprowadza nazwy modułu, z którego importujemy, do lokalnej tablicy symboli (tak więc, w tym przykładzie fibo nie jest zdefiniowane).

Jest też pewien wariant, który importuje wszystkie nazwy z modułu:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
Mechanizm ten pozwala zaimportować wszystkie nazwy z wyjątkiem tych, które zaczynają się od znaku podkreślenia (_).
Strona główna - O Pythonie - Interpreter - Samouczek - Przykłady programów - Linki