Articles

Mitä Python-Nimiavaruudet Ovat (Ja Miksi Niitä Tarvitaan?)

Nimikonflikteja tapahtuu tosielämässä koko ajan. Esimerkiksi jokaisessa koulussa, jossa olen käynyt, oli luokallani vähintään kaksi oppilasta, joilla oli sama etunimi. Jos joku tulisi luokkaan ja kysyisi oppilasta X, kysyisimme innokkaasti: ”kummasta sinä puhut? On kaksi oppilasta nimeltä X. ” sen jälkeen kyselevä henkilö antaisi meille sukunimen, ja me esittelisimme hänelle oikean X: n.

kaikki tämä sekaannus ja prosessi määrittää tarkka henkilö, josta puhumme etsimällä muuta tietoa kuin etunimi voitaisiin välttää, jos kaikilla olisi ainutlaatuinen nimi. Tämä ei ole ongelma 30 oppilaan luokassa. On kuitenkin yhä vaikeampaa keksiä ainutlaatuinen, merkityksellinen ja helposti muistettava nimi jokaiselle lapselle koulussa, kaupungissa, kaupungissa, maassa tai koko maailmassa. Toinen kysymys tarjota jokaiselle lapselle ainutlaatuinen nimi on, että prosessi määrittää, jos joku muu on myös nimetty lapsensa Macey, Maci tai Macie voisi olla hyvin väsyttävää.

hyvin samankaltainen ristiriita voi syntyä myös ohjelmoinnissa. Kun kirjoitat ohjelmaa, jossa on vain 30 riviä ilman ulkoisia riippuvuuksia, on erittäin helppoa antaa ainutlaatuisia ja merkityksellisiä nimiä kaikille muuttujillesi. Ongelma syntyy, kun ohjelmassa on tuhansia rivejä ja olet ladannut myös joitain ulkoisia moduuleja. Tässä opetusohjelmassa opit Nimiavaruuksista, niiden tärkeydestä ja laajuuden resoluutiosta Pythonissa.

Mitä ovat nimiavaruudet?

nimiavaruus on periaatteessa järjestelmä, jolla varmistetaan, että kaikki ohjelman nimet ovat ainutlaatuisia ja niitä voidaan käyttää ilman ristiriitoja. Saatat jo tietää, että kaikki Python-kuten merkkijonoja, luetteloita, toimintoja, jne.- se on esine. Toinen mielenkiintoinen seikka on, että Python toteuttaa nimiavaruudet sanakirjoina. On olemassa nimi-objekti kartoitus, jossa nimet avaimina ja objektit arvoina. Useat nimiavaruudet voivat käyttää samaa nimeä ja kartoittaa sen eri olioon. Tässä muutamia esimerkkejä nimiavaruuksista:

  • paikallinen nimiavaruus: Tämä nimiavaruus sisältää paikalliset nimet funktion sisällä. Tämä nimiavaruus luodaan, kun funktiota kutsutaan, ja se kestää vain kunnes funktio palaa.
  • globaali nimiavaruus: tämä nimiavaruus sisältää nimet eri tuoduista moduuleista, joita käytät projektissa. Se luodaan, kun moduuli on mukana projektissa, ja se kestää komentosarjan päättymiseen asti.
  • sisäänrakennettu nimiavaruus: tämä nimiavaruus sisältää sisäänrakennetut toiminnot ja sisäänrakennetut poikkeusnimet.

Python-sarjan matemaattisissa moduuleissa Envato Tuts+: ssa kirjoitin eri moduuleissa käytettävissä olevista hyödyllisistä matemaattisista funktioista. Esimerkiksi matematiikassa ja cmath-moduuleissa on paljon molemmille yhteisiä funktioita, kuten log10()acos()cos()exp() jne. Jos käytät molempia moduuleja samassa ohjelmassa, ainoa tapa käyttää näitä funktioita yksiselitteisesti on etuliite niille moduulin nimellä, kuten math.log10() ja cmath.log10().

mikä on Laajuus?

nimiavaruudet auttavat meitä yksilöimään kaikki ohjelman sisällä olevat nimet. Tämä ei kuitenkaan tarkoita, että voimme käyttää muuttujan nimeä missä tahansa haluamme. Nimellä on myös soveltamisala, joka määrittää ohjelman osat, joissa voit käyttää kyseistä nimeä ilman etuliitettä. Aivan kuten nimiavaruuksia, on myös useita scopes ohjelmassa. Tässä on luettelo joistakin laajuuksista, jotka voivat olla olemassa ohjelman suorituksen aikana.

  • paikallinen soveltamisala, joka on sisin soveltamisala, joka sisältää luettelon nykyisellä funktiolla käytettävissä olevista paikallisista nimistä.
  • kaikkien liittävien funktioiden laajuus. Nimen haku alkaa lähimmästä sulkualueesta ja siirtyy ulospäin.
  • moduulitason laajuus, joka sisältää kaikki nykyisen moduulin yleisnimet.
  • uloin soveltamisala, joka sisältää luettelon kaikista sisäänrakennetuista nimistä. Tämä soveltamisala etsitään viimeisenä, jotta löytyisi nimi, johon viittasit.

tämän opetusohjelman seuraavissa osissa käytämme laajasti sisäänrakennettua Python dir () – toimintoa palauttaaksemme nimilistan nykyiseen paikalliseen ulottuvuuteen. Tämä auttaa sinua ymmärtämään nimiavaruuksien ja laajuuden käsitteen selkeämmin.

Scope Resolution

kuten edellisessä osiossa mainitsin, tietyn nimen haku alkaa sisimmästä funktiosta ja siirtyy sitten yhä korkeammalle, kunnes ohjelma voi kartoittaa kyseisen nimen objektiksi. Kun tällaista nimeä ei löydy mistään nimiavaruuksista, ohjelma nostaa nimivirhe-poikkeuksen.

ennen kuin aloitamme, kokeile kirjoittaa dir() tyhjäkäynnillä tai millä tahansa muulla Python IDE: llä.

dir()# 

katsotaan dir() funktion ulostulo muuttujan ja funktion määrittelyn jälkeen.

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

dir() funktio tuottaa vain nykyisen soveltamisalan sisällä olevan nimilistan. Siksi some_func() on olemassa vain yksi nimi b_num. Kutsuminen dir() määrittelyn jälkeen some_func() lisää sen maailmanlaajuisessa nimiavaruudessa olevaan nimilistaan.

nyt katsotaan nimilistaa joidenkin sisäkkäisten funktioiden sisällä. Tämän lohkon koodi jatkuu edellisestä lohkosta.

yllä oleva koodi määrittelee kaksi muuttujaa ja funktion outer_func(). Sisällä inner_func()dir() funktio tulostaa vain nimen d_num. Tämä vaikuttaa oikeudenmukaiselta, sillä d_num on ainoa siellä määritelty muuttuja.

ellei ole erikseen määritelty käyttämällä global, yleisnimen siirtäminen paikallisen nimiavaruuden sisään luo uuden samannimisen paikallisen muuttujan. Tämä käy ilmi seuraavasta koodista.

sekä outer_func() että inner_func()a_num on julistettu globaaliksi muuttujaksi. Asetamme vain eri arvon samalle globaalille muuttujalle. Tästä syystä a_num kaikissa paikoissa arvo on 20. Toisaalta jokainen funktio luo oman b_num muuttujan, jolla on paikallinen ulottuvuus, ja print() funktio tulostaa tämän paikallisesti scopatun muuttujan arvon.

moduulien Tuominen oikein

on hyvin yleistä tuoda projekteihin ulkoisia moduuleja kehityksen nopeuttamiseksi. Moduulien tuontiin on kolme eri tapaa. Tässä osiossa, opit kaikki nämä menetelmät, keskustella niiden hyviä ja huonoja puolia yksityiskohtaisesti.

  • from module import *: Tämä tapa tuoda moduuli tuo kaikki nimet annetusta moduulista suoraan nykyiseen nimiavaruuteen. Saatat tuntea kiusausta käyttää tätä menetelmää, koska sen avulla voit käyttää funktiota suoraan lisäämättä moduulin nimeä etuliitteeksi. Kuitenkin, se on hyvin virhealtis, ja menetät myös kyky kertoa, mikä moduuli todella tuotu että toiminto. Tässä on esimerkki tämän menetelmän käytöstä:

Jos tunnet Matikka-ja cmath-moduulit, tiedät jo, että on olemassa muutamia yleisnimiä, jotka määritellään molemmissa moduuleissa, mutta pätevät vastaavasti reaaliluvuille ja kompleksiluvuille.

koska olemme tuoneet cmath-moduulin matematiikkamoduulin jälkeen, se korvaa näiden yhteisten funktioiden funktiomäärittelyt matematiikkamoduulista. Tämän vuoksi ensimmäinen log10(125) palauttaa reaaliluvun ja toinen log10(125) Palauttaa kompleksiluvun. log10() funktiota ei voi käyttää nyt matematiikkamoduulista. Vaikka olisit yrittänyt kirjoittaa math.log10(125), saat Nimivirhepoikkeuksen, koskamath ei varsinaisesti ole nimiavaruudessa.

tärkeintä on, että sinun ei pitäisi käyttää tätä tapaa tuoda toimintoja eri moduuleista vain säästää muutaman painalluksen.

  • from module import nameA, nameB: jos tiedät käyttäväsi moduulista vain yhtä tai kahta nimeä, voit tuoda ne suoraan tätä menetelmää käyttäen. Näin voit kirjoittaa koodin ytimekkäämmin pitäen silti nimiavaruuden saastumisen minimissä. Muista kuitenkin, ettet edelleenkään voi käyttää moduulista mitään muuta nimeä käyttämällä module.nameZ. Mikä tahansa funktio, jolla on sama nimi ohjelmassasi, korvaa myös moduulista tuodun funktion määritelmän. Tämä tekee tuodusta funktiosta käyttökelvottoman. Tässä on esimerkki tämän menetelmän käytöstä:
dir()# from math import log2, log10dir()# log10(125)# 2.0969100130080562
  • import module: tämä on turvallisin ja suositeltava tapa tuoda moduuli. Ainoa haittapuoli on, että sinun täytyy etuliite nimi moduulin kaikki Nimet, jotka aiot käyttää ohjelmassa. Voit kuitenkin välttää nimiavaruuden saastumisen ja määritellä myös funktiot, joiden nimet vastaavat moduulin funktioiden nimiä.
dir()# import mathdir()# math.log10(125)# 2.0969100130080562

lopulliset ajatukset

toivon, että tämä opetusohjelma auttoi sinua ymmärtämään nimiavaruuksia ja niiden tärkeyttä. Sinun pitäisi nyt pystyä määrittämään laajuus eri nimiä ohjelmassa ja välttää mahdolliset sudenkuopat.

lisäksi, älä epäröi nähdä, mitä meillä on myynnissä ja tutkittavana markkinoilla, äläkä epäröi kysyä mitään kysymyksiä ja antaa arvokasta palautetta käyttäen syötteen alla.

artikkelin viimeisessä osassa käsiteltiin erilaisia tapoja tuoda moduuleja Python-kielellä ja niiden hyviä ja huonoja puolia. Jos sinulla on kysymyksiä, jotka liittyvät tähän aiheeseen, kerro minulle kommenteissa.

Opi Python

Opi Python täydellisellä python-opetusoppaallamme, olitpa vasta aloittelemassa tai kokenut koodari, joka haluaa oppia uusia taitoja.