Python - Moduli


Šta su moduli u Pythonu?

Moduli se odnose na datoteku koja sadrži Python izraze i definicije. Datoteka koja sadrži Python kod, na primjer: example.py, naziva se modulom, a njeno ime modula bi bilo primjer. Koristimo module za razgrađivanje velikih programa na male upravljačke i organizovane datoteke. Moduli omogućavaju ponovnu upotrebu koda. U modulu možemo definisati najčešće korištene funkcije i uvesti ga, umjesto kopiranja njihovih definicija u različite programe. Stvorimo sada modul. Upišite sljedeći kod i spremite ga kao example.py.

# Python Modul primjer

def add(a, b):
   """Ovaj program dodaje dva
    brojevi i vraća rezultat"""

   result = a + b
   return result

Ovdje smo definisali funkciju add() unutar modula nazvanog example. Funkcija uzima dva broja i vraća njihov zbir.



Kako uvesti module u Pythonu?

Definicije unutar modula možemo uvesti u drugi modul ili interaktivni tumač (interactive interpreter) u Python-u. Za to koristimo ključnu riječ import. Da bismo uvezli naš prethodno definisani primjer modula, u Python upitu kucamo sljedeće.

>>> import example

Ovo ne uvozi imena funkcija definisanih u primjeru direktno u trenutnu tabelu simbola. Tamo uvozi samo primjer imena modula. Koristeći ime modula možemo pristupiti funkciji pomoću tačke . operater. Na primjer:

>>> example.add(4,5.5)
9.5

Python ima mnoštvo standardnih modula. Možete pogledati kompletnu listu Python standardnih modula i njihove slučajeve upotrebe. Te se datoteke nalaze u direktoriju Lib unutar lokacije na kojoj ste instalirali Python. Standardni moduli se mogu uvesti na isti način na koji uvozimo naše korisnički definisane module. Postoje različiti načini za uvoz modula. Oni su navedeni u nastavku.



Izjava o uvozu Pythona (import statement)

Možemo uvoziti modul pomoću naredbe import i pristupiti definicijama unutar njega pomoću operatora tačaka . kako je gore opisano. Pogledajmo primjer.

# primjer izjave o uvozu (import statement)
# uvoz standardne matematike modula

import math
print("Vrijednost pi je: ", math.pi)


Uvoz sa preimenovanjem (renaming)

Modul možemo uvesti preimenovanjem na sljedeći način:

# import modul preimenovanjem

import math as m
print("Vrijednost pi je: ", m.pi)

Matematički smo modul preimenovali u m. To nam u nekim slučajevima može uštediti vrijeme za tipkanje. Imajte na umu da naziv math nije prepoznat u našem opsegu. Dakle, math.pi je nevaljan, a m.pi je ispravna implementacija.



Python from...import o uvozu

Možemo uvesti određena imena iz modula bez uvoza modula u cjelini. Pogledajmo primjera:

# iuvezi samo pi iz math modula

from math import pi
print("Vrijednost pi je: ", pi)

Ovdje smo iz math modula uvezli samo atribut pi. U takvim slučajevima ne koristimo tačka operator. Takođe možemo uvesti više atributa, kao što je prikazano u sljedećem primjeru:

>>> from math import pi, e
>>> pi
3.141592653589793
>>> e
2.718281828459045


Uvoz svih imena (Import all names)

Sva imena (definicije) iz modula možemo uvesti pomoću sljedeće konstrukcije:

# uvezi sva imena iz math standardnog modula

from math import *
print("Vrijednost pi je: ", pi)

Ovdje smo uveli sve definicije iz math modula. To uključuje sva imena vidljiva u našem opsegu, osim onih koja počinju s podvlakom (privatne definicije (private definitions)). Uvoz svega sa zvjezdicom (*) nije dobra praksa programiranja. To može dovesti do duplanja definicija za identifikator. Takođe ometa čitljivost našeg koda.



Pretraživanje putanje Python modula (Module Search Path)

Dok uvozi modul, Python gleda na nekoliko mjesta. Tumač prvo traži ugrađeni modul. Zatim (ako ugrađeni modul nije pronađen), Python pregleda listu direktorija definisanih u sys.path. Pretraga je u ovom redoslijedu:

  • Trenutni direktorij.
  • PYTHONPATH (environment variable s popisom direktorija).
  • Zadani direktori zvaisno o instalaciji.
>>> import sys
>>> sys.path
['',
'C:\\Python33\\Lib\\idlelib',
'C:\\Windows\\system32\\python33.zip',
'C:\\Python33\\DLLs',
'C:\\Python33\\lib',
'C:\\Python33',
'C:\\Python33\\lib\\site-packages']

Ovu listu možemo dopuniti i izmijeniti kako bismo dodali vlastitu putanju.



Ponovno učitavanje modula (Reloading a module)

Python interpreter uvozi modul samo jednom tokom sesije. To stvari čini efikasnijima. Evo primjera koji pokazuje kako ovo funkcioniše. Pretpostavimo da imamo sljedeći kod u modulu nazvanom my_module.

# Ovaj modul prikazuje učinak
# višestruki uvoz i ponovno učitavanje

print("Ovaj kod je izvršen")

Sada vidimo učinak višestrukog uvoza.

>>> import my_module
Ovaj kod je izvršen
>>> import my_module
>>> import my_module

Vidimo da se naš kod izvršio samo jednom. To znači da je naš modul uvezen samo jednom. Ako se naš modul promijenio tokom programa, morali bismo ga ponovo učitati. Jedan od načina da to učinimo je ponovno pokretanje tumača (interpreter). Ali ovo ne pomaže puno. Python pruža efikasniji način za to. Možemo koristiti funkciju reload() unutar imp modula za ponovno učitavanje modula. To možemo učiniti na sljedeće načine:

>>> import imp
>>> import my_module
Ovaj kod je izvršen
>>> import my_module
>>> imp.reload(my_module)
Ovaj kod je izvršen
<module 'my_module' from '.\\my_module.py'>


Ugrađena funkcija dir() (dir() built-in function)

Pomoću funkcije dir() možemo pronaći imena koja su definisana unutar modula. Na primjer, definisali smo funkciju add() u example modula koju smo imali na početku. dir u example modula možemo koristiti na sljedeći način:

>>> dir(example)
['__builtins__',
'__cached__',
'__doc__',
'__file__',
'__initializing__',
'__loader__',
'__name__',
'__package__',
'add']

Ovdje možemo vidjeti sortiranu listu imena (zajedno s add). Sva ostala imena koja počinju donjom crtom su zadani Python atributi pridruženi modulu (nisu definisani od korisnika). Na primjer, atribut __name__ sadrži ime modula.

>>> import example
>>> example.__name__
'example'

Sva imena definisana u našem trenutnom prostoru imena mogu se pronaći pomoću funkcije dir() bez ikakvih argumenata.

>>> a = 1
>>> b = "hello"
>>> import math
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'b', 'math', 'pyscripter']