Što naši programi postaju veći i kompleksniji, tim ih je teže
provjeravati i ispravljati pogreške u njima. Zato postoji mogućnost
podjele programskog koda u više programskih datoteka (modula). Tada je
moguće u jednoj programskoj datoteci napisati glavni dio koda, u drugoj
funkcije za pripremu rada programa, u trećoj opcije glavnog izbornika, u
četvrtoj konfiguraciju itd.
Važna pravila kod organizacije modula:
1. Sve programske datoteke moraju biti u istom folderu gdje se nalazi i
glavna programska datoteka. Alternativno, potrebno je pomoću sys.path
funkcije koja pripada sys modulu iz standardne Python biblioteke navesti
direktorije u kojima se moduli spremaju, kako bi ih interpretator mogao
naći.
2. Prema početnim vrijednostima, Python traži dodatne module i pakete u
Python27 folderu, u podfolderima lib/site-packages, gdje se nalaze i svi
drugi moduli i paketi koji pripadaju Python standardnoj biblioteci, plus
drugi eksterni moduli i paketi instalirani od strane korisnika.
Paketi se razlikuju od modula u tome što je paket zapravo podmapa koja
sadrži module. Pravila kod organizacije paketa su sljedeća:
1. Mapa koja sadrži paket mora se nalaziti u istom folderu gdje je i
glavna programska datoteka.
2. U mapi određenog paketa mora se nalaziti datoteka naziva __init__.py,
koja se prva izvršava nakon što se paket importira. Ona može biti
prazna, ali može sadržavati i naredbe za automatsko importiranje drugih
modula unutar paketa, te druge naredbe koje je potrebno izvršiti kod
importiranja paketa.
Importiranje modula i pozivanje objekata iz modula
Predpostavimo da imamo mapu u kojoj nam se nalaze tri datoteke. Jedna s
nazivom glavna.py, druga s nazivom priprema.py, i treća s nazivom
uvod.py. Sada ćemo kao primjer prvo napisati zadnje dvije, a nakon toga
glavnu datoteku u koju ćemo importirati zadnja dva modula i pozivati
funkcije i varijable iz njih.
priprema.py:
u_pripremi = False
def zapocni():
u_pripremi = True
print "Molim pricekajte, u pripremi je pokretanje."
uvod.py:
def pozdrav():
print "Program pokrenut!"
glavna.py:
import priprema
import uvod
if __name__ == "__main__":
priprema.zapocni()
if priprema.u_tijeku:
uvod.pozdrav()
Slijedi pojašnjenje:
U modulu priprema, koji se nalazi unutar datoteke priprema.py, kreirali
smo varijablu u_tijeku koja sadrži Boolean vrijednost te označava je li
priprema započela, te funkciju zapocni. U drugom modulu zvanom uvod, u
datoteci uvod.py, napravili smo funkciju koja ispisuje pozdravnu poruku.
Na kraju smo u datoteci glavna.py odradili proces importiranja modula,
te pozivali funkcije i varijable iz njih.
Ovdje ste primijetili jednu novu ključnu riječ, import. Ova naredba
koristi se za importiranje jednog ili više modula, te svih objekata koji
se nalaze unutar importiranih modula. Kada je modul uspješno importiran,
moguće je pristupiti svim funkcijama unutar istog.
Dakle, za importiranje modula, koristi se sljedeća sintaksa:
import ime_modula
Za pozivanje funkcija, varijabli i ostalih objekata iz određenog modula,
koristi se sljedeća sintaksa:
ime_modula.ime_funkcije()
ime_modula.ime_varijable
Dakle, za razliku od prije gdje smo sve pisali u istoj datoteci, u
slućaju modula potrebno je osim naziva objekta navesti i ime modula iz
kojeg se objekt poziva. Dakle u primjeru iznad mogli ste primijetiti
sljedeće linije koda:
priprema.zapocni()
i
uvod.pozdrav()
Ovo govori interpretatoru da traži funkciju zapocni unutar modula
pripremi, a funkciju pozdrav unutar modula uvod. Važna napomena, ime
modula i ime objekata se *UVIJEK* odvaja točkom (.)! Također je važno
napomenuti da ukoliko se unese samo ime funkcije bez naziva modula i
znaka za odvajanje (točke), interpretator će misliti da hoćemo tu
funkciju pozvati iz trenutno korištene datoteke, i naravno, javit će se
pogreška da te funkcije nema.
Sigurno se pitate može li se nekako spriječiti unošenje naziva modula uz
nazive objekata, pa da se mogu unositi samo nazivi objekata kao i kod
pisanja programa u jednoj datoteci? Može, evo kako!
Prvi način, importiranje svega iz modula:
from priprema import *
zapocni()
Dakle, upotrebom naredbe from X import Y, možemo narediti interpretatoru
iz kojeg modula će što importirati. Ukoliko navedemo znak zvjezdica (*)
umjesto objekata koje treba importirati iz modula, importirat će se svi
objekti odjednom. Kada importiramo sve objekte odjednom, dovoljno je
pozvati objekt bez potrebe za dodatnim unošenjem naziva modula i znaka
za odvajanje (točke). Savjet: Ne bi preporučio ovakav način importiranja
ukoliko radite s više od jednog modula u istoj datoteci, jer to može
nakon nekog vremena zbuniti programera, a u najgorem slućaju ako
nekoliko modula ima objekt istog naziva, tada može doći i do problema u
izvršavanju programa.
Drugi način, importiranje pojedinog objekta za koji znamo da će nam
trebati iz modula:
from priprema import zapocni
zapocni()
Ovdje smo naredili interpretatoru da iz modula priprema importira
funkciju zapocni, sto znaći da ćemo jedino toj funkciji moći pristupiti
bez potrebe za upisivanjem imena modula i točke za odvajanje.
Višestruko importiranje modula i funkcija:
Prisjetimo se ranijeg koda u datoteci glavna.py koja je u sebi sadrzala
dvije import naredbe, dakle za svaki modul posebno. Moguće je to i
skratiti, te pomoću jedne import naredbe navesti više modula koje želimo
importirati. Nazivi modula moraju se odvojiti zarezom, svi osim zadnjeg
navedenog.
Dakle, način višestrukog importiranja je:
import priprema, uvod
Znači, sada smo koristeći jednu import naredbu importirali i modul
priprema i modul uvod.
Također je osim višestrukog importiranja modula moguće i višestruko
importiranje objekata iz pojedinog modula. Evo kako:
from priprema import u_tijeku, zapocni
Dakle, iz modula priprema importirali smo varijablu u_tijeku i funkciju
zapocni, i sada obje od njih možemo koristiti bez unošenja naziva modula
i znaka za odvajanje. Ovdje se objekti također odvajaju zarezom, svi
osim zadnjeg. Savjet: Radi bolje čitljivosti i snalažljivosti, bolje je
raditi jednostruko importiranje, dakle svaki modul importirati zasebno.
Završne napomene:
1. Importiranje modula je moguće u bilo kojem dijelu programskog koda.
Nije nužno importiranje raditi na početku. Ukoliko se importiranje radi
unutar neke funkcije u dijelu programa koji se kasnije izvršava, modul
će se tada importirati kasnije, a ne odmah pri uključenju programa.
2. Moduli se osim u glavnoj datoteci mogu importirati i unutar drugih
modula, dakle tu ne postoji granica.
3. Za razliku od nekih programskih jezika, u Python jeziku nije dovoljno
importirati neki modul u glavnoj datoteci i onda ga koristiti u drugim
modulima koji pripadaju programu bez ponovnog importiranja. U Python
jeziku svi se moduli importiraju za korištenje u trenutnoj datoteci, te
ih je potrebno posebno importirati i u svaki drugi modul u kojemu ih
mislimo koristiti.
Importiranje paketa
Ovaj dio je još u izradi.