Articles

Ce Sunt Spațiile De Nume Python (Și De Ce Sunt Necesare?)

conflictele de nume se întâmplă tot timpul în viața reală. De exemplu, fiecare școală la care am mers vreodată avea cel puțin doi elevi din clasa mea care aveau același prenume. Dacă cineva ar intra în clasă și ar cere elevul X, am întreba cu entuziasm: „despre care vorbești? Există doi studenți pe nume X. ” După aceea, persoana care întreabă ne-ar da un nume de familie și i-am prezenta X-ul potrivit.

toată această confuzie și procesul de determinare a persoanei exacte despre care vorbim căutând alte informații în afară de un prenume ar putea fi evitate dacă toată lumea ar avea un nume unic. Aceasta nu este o problemă într-o clasă de 30 de elevi. Cu toate acestea, va deveni din ce în ce mai dificil să vină cu un nume unic, semnificativ și ușor de reținut pentru fiecare copil dintr-o școală, oraș, oraș, țară sau întreaga lume. O altă problemă în a oferi fiecărui copil un nume unic este că procesul de a determina dacă altcineva și-a numit și copilul Macey, Maci sau Macie ar putea fi foarte obositor.

un conflict foarte similar poate apărea și în programare. Când scrieți un program de doar 30 de linii fără dependențe externe, este foarte ușor să dați nume unice și semnificative tuturor variabilelor dvs. Problema apare atunci când există mii de linii într-un program și ați încărcat și câteva module externe. În acest tutorial, veți afla despre spațiile de nume, importanța lor și rezoluția domeniului de aplicare în Python.

ce sunt spațiile de nume?

un spațiu de nume este practic un sistem pentru a vă asigura că toate numele dintr-un program sunt unice și pot fi utilizate fără niciun conflict. S—ar putea să știți deja că totul în șiruri, liste, funcții, etc.- este un obiect. Un alt fapt interesant este că Python implementează spații de nume ca dicționare. Există o mapare nume-obiect, cu numele ca chei și obiectele ca valori. Mai multe spații de nume pot utiliza același nume și îl pot mapa la un alt obiect. Iată câteva exemple de spații de nume:

  • Spațiu de nume Local: Acest spațiu de nume include nume locale în interiorul unei funcții. Acest spațiu de nume este creat atunci când o funcție este apelată și durează doar până când funcția revine.
  • Spațiu de nume Global: acest spațiu de nume include nume din diferite module importate pe care le utilizați într-un proiect. Acesta este creat atunci când modulul este inclus în proiect și durează până când scriptul se termină.
  • Spațiu de nume încorporat: acest spațiu de nume include funcții încorporate și nume de excepții încorporate.

în modulele Matematice din seria Python de pe Envato Tuts+, am scris despre funcțiile matematice utile disponibile în diferite module. De exemplu, modulele math și cmath au o mulțime de funcții comune ambelor, cum ar fi log10()acos()cos()exp() etc. Dacă utilizați ambele module în același program, singura modalitate de a utiliza aceste funcții fără echivoc este să le prefixați cu numele modulului, cum ar fi math.log10() și cmath.log10().

ce este domeniul de aplicare?

spațiile de nume ne ajută să identificăm în mod unic toate numele dintr-un program. Cu toate acestea, acest lucru nu implică faptul că putem folosi un nume de variabilă oriunde dorim. Un nume are, de asemenea, un domeniu de aplicare care definește părțile programului în care puteți utiliza acel nume fără a utiliza niciun prefix. La fel ca spațiile de nume, există, de asemenea, mai multe domenii într-un program. Iată o listă a unor domenii care pot exista în timpul executării unui program.

  • un domeniu local, care este domeniul cel mai interior care conține o listă de nume locale disponibile în funcția curentă.
  • un domeniu de aplicare a tuturor funcțiilor de închidere. Căutarea unui nume începe de la cel mai apropiat domeniu de închidere și se deplasează spre exterior.
  • un domeniu de nivel de modul care conține toate numele globale din modulul curent.
  • domeniul de aplicare ultraperiferice care conține o listă cu toate numele built-in. Acest domeniu este căutat ultima dată pentru a găsi numele la care ați făcut referire.

în secțiunile următoare ale acestui tutorial, vom folosi extensiv funcția Python Dir() încorporată pentru a returna o listă de nume în domeniul local actual. Acest lucru vă va ajuta să înțelegeți mai clar conceptul de spații de nume și domeniu de aplicare.

Scope Resolution

după cum am menționat în secțiunea anterioară, căutarea unui nume dat începe de la funcția cea mai interioară și apoi se mișcă din ce în ce mai sus până când programul poate mapa acel nume la un obiect. Când nu se găsește un astfel de nume în niciunul dintre spațiile de nume, programul ridică o excepție NameError.

înainte de a începe, încercați să tastațidir() în IDLE sau în orice alt IDE Python.

dir()# 

să vedem ieșirea funcțieidir() după definirea unei variabile și a unei funcții.

a_num = 10dir()# def some_func(): b_num = 11 print(dir()) some_func()# dir()# 

funcțiadir() afișează numai lista de nume din cadrul domeniului curent. De aceea, în interiorul domeniului some_func(), există un singur nume numit b_num. Apelarea dir() după definirea some_func() îl adaugă la lista de nume disponibile în spațiul de nume global.

acum, să vedem lista de nume din interiorul unor funcții imbricate. Codul din acest bloc continuă din blocul anterior.

codul de mai sus definește două variabile și o funcție în interiorul domeniului de aplicare al outer_func(). În interiorulinner_func()dir() funcția imprimă doar numeled_num. Acest lucru pare corect ca d_num este singura variabilă definită acolo.

dacă nu se specifică Explicit prin utilizareaglobal, reatribuirea unui nume global într-un spațiu de nume local creează o nouă variabilă locală cu același nume. Acest lucru este evident din următorul cod.

în interiorul ambelorouter_func() șiinner_func()a_num a fost declarată a fi o variabilă globală. Stabilim doar o valoare diferită pentru aceeași variabilă globală. Acesta este motivul pentru care valoarea a_num în toate locațiile este 20. Pe de altă parte, fiecare funcție își creează propria variabilă b_num cu un domeniu local, iar funcția print() imprimă valoarea acestei variabile cu scop local.

importarea corectă a modulelor

este foarte obișnuit să importați module externe în proiectele dvs. pentru a accelera dezvoltarea. Există trei moduri diferite de a importa module. În această secțiune, veți afla despre toate aceste metode, discutând în detaliu argumentele pro și contra.

  • from module import *: Această metodă de importare a unui modul importă toate numele din modulul dat direct în spațiul de nume curent. S-ar putea să fiți tentat să utilizați această metodă, deoarece vă permite să utilizați direct o funcție fără a adăuga numele modulului ca prefix. Cu toate acestea, este foarte predispus la erori și, de asemenea, pierdeți capacitatea de a spune ce modul a importat efectiv această funcție. Iată un exemplu de utilizare a acestei metode:

dacă sunteți familiarizați cu modulele math și cmath, știți deja că există câteva nume comune care sunt definite în ambele module, dar se aplică numerelor reale și, respectiv, complexe.

deoarece am importat modulul cmath după modulul math, acesta suprascrie definițiile funcțiilor acestor funcții comune din modulul math. Acesta este motivul pentru care primul log10(125) returnează un număr real și al doilea log10(125) returnează un număr complex. Nu există nicio modalitate de a utiliza funcția log10() din modulul math acum. Chiar dacă ați încercat să tastați math.log10(125), veți primi o excepție NameError deoarece math nu există de fapt în spațiul de nume.

concluzia este că nu ar trebui să utilizați acest mod de a importa funcții din diferite module doar pentru a salva câteva apăsări de taste.

  • from module import nameA, nameB: dacă știți că veți folosi doar unul sau două nume dintr-un modul, le puteți importa direct folosind această metodă. În acest fel, puteți scrie codul mai concis, păstrând în același timp poluarea spațiului de nume la minimum. Cu toate acestea, rețineți că încă nu puteți utiliza niciun alt nume din modul utilizând module.nameZ. Orice funcție care are același nume în programul dvs. va suprascrie, de asemenea, definiția acelei funcții importate din modul. Acest lucru va face funcția importată inutilizabilă. Iată un exemplu de utilizare a acestei metode:
dir()# from math import log2, log10dir()# log10(125)# 2.0969100130080562
  • import module: acesta este cel mai sigur și recomandat Mod de a importa un modul. Singurul dezavantaj este că va trebui să prefixați numele modulului la toate numele pe care urmează să le utilizați în program. Cu toate acestea, veți putea evita poluarea spațiului de nume și, de asemenea, să definiți funcții ale căror nume se potrivesc cu numele funcțiilor din modul.
dir()# import mathdir()# math.log10(125)# 2.0969100130080562

Gânduri finale

sper că acest tutorial v-a ajutat să înțelegeți spațiile de nume și importanța lor. Acum ar trebui să puteți determina domeniul de aplicare al diferitelor nume dintr-un program și să evitați potențialele capcane.

în plus, nu ezitați să vedeți ce avem la dispoziție pentru vânzare și pentru studiu pe piață și nu ezitați să puneți întrebări și să oferiți feedback-ul dvs. valoros folosind feedul de mai jos.secțiunea finală a articolului a discutat diferite moduri de a importa module în Python și avantajele și dezavantajele fiecăruia dintre ele. Dacă aveți întrebări legate de acest subiect, vă rog să-mi spuneți în comentarii.

Learn Python

Learn Python cu ghidul nostru complet Tutorial python, indiferent dacă sunteți doar la început sau sunteți un coder condimentată în căutarea de a învăța noi competențe.