|
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 (_).
|
|