Definirea și conectarea modulelor
Un modul în limbajul Python reprezintă un fișier separat cu cod, care poate fi reutilizat în alte programe.
Pentru a crea un modul, trebuie să creați un fișier cu extensia *.py, care va reprezenta modulul. Numele fișierului va reprezenta numele modulului. Apoi, în acest fișier trebuie să definiți una sau mai multe funcții.
Să presupunem că fișierul principal al programului se numește main.py și dorim să conectăm la acesta module externe.
Pentru aceasta, mai întâi vom defini un nou modul: vom crea un fișier nou în aceeași mapă în care se află main.py, pe care îl vom numi message.py. În mod implicit, interpretatorul Python caută modulele într-o serie de căi standard, una dintre acestea fiind folderul scriptului principal. De aceea, pentru a simplifica, vom plasa ambele fișiere în același proiect pentru ca interpretatorul să detecteze modulul message.py.

Prin urmare, modulul se va numi message. Vom defini în el următorul cod:
hello = "Hello all"
def print_message(text):
print(f"Message: {text}")
Aici este definită variabila hello și funcția print_message, care primește un text ca parametru și îl afișează în consolă.
În fișierul principal al programului - main.py, vom utiliza acest modul:
import message # conectăm modulul message
# afișăm valoarea variabilei hello
print(message.hello) # Hello all
# apelăm funcția print_message
message.print_message("Hello work") # Message: Hello work
Pentru a utiliza modulul, acesta trebuie importat cu ajutorul operatorului import, după care se specifică numele modulului: import message.
Pentru a accesa funcționalitatea modulului, trebuie să obținem spațiul său de nume. În mod implicit, acesta va coincide cu numele modulului, deci în cazul nostru se va numi tot message.
Obținând spațiul de nume al modulului, vom putea accesa funcțiile sale după schema:
spațiu_de_nume.funcție
De exemplu, apelarea funcției print_message() din modulul message:
message.print_message("Hello work")
După aceasta, putem rula scriptul principal main.py, iar acesta va folosi modulul message.py. Ieșirea în consolă va fi:
Hello all
Message: Hello work
Conectarea funcționalității modulului în spațiul de nume global
O altă opțiune presupune importarea funcționalității modulului în spațiul de nume global al modulului curent folosind cuvântul cheie from:
from message import print_message
# apelăm funcția print_message din modulul message
print_message("Hello work") # Message: Hello work
# variabila hello din modulul message nu este accesibilă, deoarece nu a fost importată
# print(message.hello)
# print(hello)
În acest caz, importăm din modulul message în spațiul de nume global funcția print_message(). De aceea, o putem utiliza fără a specifica spațiul de nume al modulului, ca și cum ar fi fost definită în acest fișier.
Toate celelalte funcții și variabile din modul nu sunt accesibile (așa cum variabila hello nu este accesibilă în exemplul de mai sus). Dacă dorim să le utilizăm și pe acestea, le putem importa separat:
from message import print_message
from message import hello
# apelăm funcția print_message din modulul message
print_message("Hello work") # Message: Hello work
# apelăm variabila hello din modulul message
print(hello) # Hello all
Dacă trebuie să importăm în spațiul de nume global întreaga funcționalitate, putem folosi simbolul * în locul denumirilor funcțiilor și variabilelor:
from message import *
# apelăm funcția print_message din modulul message
print_message("Hello work") # Message: Hello work
# apelăm variabila hello din modulul message
print(hello) # Hello all
Totuși, trebuie menționat că importul în spațiul de nume global poate provoca coliziuni de nume ale funcțiilor. De exemplu, dacă în același fișier este definită o funcție cu același nume, funcția definită ultima va fi cea apelată:
from message import *
print_message("Hello work") # Message: Hello work - se aplică funcția din modulul message
def print_message(some_text):
print(f"Text: {some_text}")
print_message("Hello work") # Text: Hello work - se aplică funcția din fișierul curent
Astfel, o funcție cu același nume din fișierul curent ascunde funcția din modulul importat.
Stabilirea de pseudonime
La importul unui modul și al funcționalității acestuia, putem stabili pseudonime pentru acestea. Pentru aceasta se folosește cuvântul cheie as, urmat de pseudonim. De exemplu, stabilim un pseudonim pentru modul:
import message as mes # modulul message este mapat pe pseudonimul mes
# afișăm valoarea variabilei hello
print(mes.hello) # Hello all
# apelăm funcția print_message
mes.print_message("Hello work") # Message: Hello work
În acest caz, spațiul de nume se va numi mes, și prin acest pseudonim putem accesa funcționalitatea modulului.
În mod similar, putem stabili pseudonime pentru funcționalitatea specifică a modulului:
from message import print_message as display
from message import hello as welcome
print(welcome) # Hello all - variabila hello din modulul message
display("Hello work") # Message: Hello work - funcția print_message din modulul message
Aici, pentru funcția print_message din modulul message se stabilește pseudonimul display, iar pentru variabila hello - pseudonimul welcome. Și prin aceste pseudonime putem accesa funcționalitatea respectivă.
Pseudonimele pot fi utile atunci când numele funcțiilor și variabilelor nu ne convin, de exemplu, sunt prea lungi și dorim să le scurtăm, sau dorim să le dăm nume mai descriptive, din punctul nostru de vedere. Sau dacă în fișierul curent există deja funcționalități cu aceleași nume, iar prin stabilirea de pseudonime putem evita conflictele de nume. De exemplu:
from message import print_message as display
def print_message(some_text):
print(f"Text: {some_text}")
# funcția print_message din modulul message
display("Hello work") # Message: Hello work
# funcția print_message din fișierul curent
print_message("Hello work") # Text: Hello work
Numele modulului
În exemplul de mai sus, modulul main.py, care este principal, folosește modulul message.py. La rularea modulului main.py, programul va executa toată munca necesară. Cu toate acestea, dacă rulăm separat modulul message.py de sine stătător, nu vom vedea nimic în consolă. Asta pentru că modulul message definește doar o funcție și o variabilă și nu efectuează nicio altă acțiune. Dar putem face ca modulul message.py să poată fi utilizat atât singur, cât și conectat la alte module.
La executarea unui modul, mediul îi determină numele și îl atribuie variabilei globale __name__ (cu două caractere de subliniere pe ambele părți). Dacă modulul este cel lansat, atunci numele său va fi __main__ (tot cu două caractere de subliniere pe fiecare parte). Dacă modulul este utilizat într-un alt modul, atunci la executare, numele său va fi similar cu numele fișierului fără extensia py. Și putem folosi acest lucru. Așadar, să modificăm conținutul fișierului message.py:
hello = "Hello all"
def print_message(text):
print(f"Message: {text}")
def main():
print_message(hello)
if __name__ == "__main__":
main()
În acest caz, în modulul message.py a fost adăugată o funcție main pentru testarea funcționalității modulului. Și putem rula fișierul message.py separat pentru a testa codul.
Trebuie să acordăm atenție apelului funcției main:
if __name__ == "__main__":
main()
Variabila __name__ indică numele modulului. Pentru modulul principal, care este lansat direct, această variabilă va avea întotdeauna valoarea __main__, indiferent de numele fișierului.
Prin urmare, dacă rulăm scriptul message.py separat, Python va atribui variabilei __name__ valoarea __main__, și apoi în expresia if va apela funcția main din acest fișier.
Totuși, dacă rulăm un alt script, iar acest fișier - message.py - este conectat ca auxiliar, pentru message.py variabila __name__ va avea valoarea message. Și, în consecință, metoda main din fișierul message.py nu va fi executată.
Acest mod de verificare a numelui modulului este o abordare mai recomandată decât simplul apel al metodei main.
În fișierul main.py, putem face, de asemenea, o verificare pentru a vedea dacă modulul este principal (deși acest lucru nu este neapărat necesar):
import message
def main():
message.print_message("Hello work") # Message: Hello work
if __name__ == "__main__":
main()
Python oferă o serie de module integrate, pe care le putem utiliza în programele noastre. În articolele următoare vom explora principalele dintre acestea.