Mik Azok A Python Névterek (És Miért Van Rájuk Szükség?)
A Névkonfliktusok a való életben állandóan előfordulnak. Például minden iskolában, ahol valaha jártam, legalább két tanuló volt az osztályomban, akiknek ugyanaz a keresztneve volt. Ha valaki bejönne az osztályba és Elkérné az X. tanulót, lelkesen kérdeznénk: “melyikről beszélsz? Két X nevű diák van. ” Ezután a kérdező személy megadta nekünk a vezetéknevét, és bemutattuk neki a jobb X-et.
mindez a zavar és a pontos személy meghatározásának folyamata, amelyről beszélünk, a keresztnéven kívül más információk keresésével elkerülhető lenne, ha mindenkinek egyedi neve lenne. Ez nem jelent problémát egy 30 fős osztályban. Azonban egyre nehezebb lesz egyedi, értelmes és könnyen megjegyezhető nevet találni minden gyermek számára egy iskolában, városban, városban, országban vagy az egész világon. Egy másik kérdés, hogy minden gyermeknek egyedi nevet adjon, az, hogy annak meghatározása, hogy valaki más Macey-nek, Maci-nek vagy Macie-nek is nevezte-e gyermekét, nagyon fárasztó lehet.
egy nagyon hasonló konfliktus is felmerülhet a programozásban. Ha csak 30 sorból álló programot írsz külső függőségek nélkül, nagyon könnyű egyedi és értelmes neveket adni az összes változónak. A probléma akkor merül fel, ha több ezer sor van egy Programban, és néhány külső modult is betöltött. Ebben az oktatóanyagban megismerheti a névtereket, azok fontosságát és a hatókör felbontását a Pythonban.
mik azok a névterek?
a névtér alapvetően egy olyan rendszer, amely biztosítja, hogy a program Összes neve egyedi legyen, és ütközés nélkül használható. Lehet, hogy már tudja, hogy minden Python—szerű karakterláncok, listák, funkciók, stb.- egy tárgy. Egy másik érdekes tény, hogy a Python a névtereket szótárakként valósítja meg. Van egy név-objektum leképezés, amelyben a nevek kulcsként, az objektumok pedig értékként szerepelnek. Több névtér is használhatja ugyanazt a nevet, és leképezheti egy másik objektumra. Íme néhány példa a névterekre:
- helyi névtér: Ez a névtér helyi neveket tartalmaz egy függvényen belül. Ez a névtér egy függvény meghívásakor jön létre, és csak addig tart, amíg a függvény vissza nem tér.
- globális névtér: ez a névtér a projektben használt különböző importált modulok neveit tartalmazza. Ez akkor jön létre, amikor a modul szerepel a projektben, és addig tart, amíg a szkript véget nem ér.
- beépített névtér: ez a névtér beépített függvényeket és beépített kivételneveket tartalmaz.
az Envato Tuts+ Python mathematical Modules sorozatában a különböző modulokban elérhető hasznos matematikai függvényekről írtam. Például a math és a cmath modulok sok olyan funkcióval rendelkeznek, amelyek mindkettőben közösek, például log10()
acos()
cos()
exp()
stb. Ha mindkét modult ugyanabban a programban használja, az egyetlen módja annak, hogy ezeket a függvényeket egyértelműen használja, ha előtaggal látja el őket a modul nevével, például math.log10()
és cmath.log10()
.
mi a hatókör?
a névterek segítenek a programon belüli összes név egyedi azonosításában. Ez azonban nem jelenti azt, hogy a változó nevét bárhol használhatjuk. A névnek van egy hatóköre is, amely meghatározza a program azon részeit, ahol ezt a nevet bármilyen előtag használata nélkül használhatja. Csakúgy, mint a névterek, több hatókör is van egy programban. Itt van egy lista néhány hatókörről, amelyek létezhetnek EGY program végrehajtása során.
- helyi hatókör, amely a legbelső hatókör, amely az aktuális függvényben elérhető helyi nevek listáját tartalmazza.
- az összes mellékelt függvény hatóköre. A név keresése a legközelebbi zárt hatókörből indul ki, és kifelé mozog.
- modulszintű hatókör, amely az aktuális modul összes globális nevét tartalmazza.
- a legkülső hatókör, amely tartalmazza az összes beépített Név listáját. Ezt a hatókört keresi utoljára, hogy megtalálja a hivatkozott nevet.
az oktatóanyag következő szakaszaiban széles körben használjuk a beépített Python dir() függvényt a nevek listájának visszaadására az aktuális helyi hatókörben. Ez segít jobban megérteni a névterek és a hatókör fogalmát.
Hatókörfelbontás
amint azt az előző szakaszban említettem, az adott név keresése a legbelső függvénytől kezdődik, majd egyre magasabbra mozog, amíg a program képes leképezni ezt a nevet egy objektumra. Ha egyik névtérben sem található ilyen név, a program felvet egy NameError kivételt.
mielőtt elkezdenénk, próbálja meg beírni a dir()
tétlen vagy bármely más Python IDE-t.
dir()#
nézzük meg adir()
függvény kimenetét egy változó és egy függvény meghatározása után.
a_num = 10dir()# def some_func(): b_num = 11 print(dir()) some_func()# dir()#
a dir()
funkció csak az aktuális hatókörön belüli nevek listáját adja ki. Ezért a some_func()
hatókörén belül csak egy név van, az úgynevezett b_num
. Hívás dir()
a some_func()
meghatározása után hozzáadja a globális névtérben elérhető nevek listájához.
most nézzük meg a nevek listáját néhány beágyazott függvényben. A blokk kódja az előző blokkból folytatódik.
a fenti kód két változót és egy függvényt határoz meg a outer_func()
hatókörén belül. Belül inner_func()
, a dir()
függvény csak a d_num
nevet nyomtatja ki. Ez igazságosnak tűnik, mivel a d_num
az egyetlen változó, amelyet ott definiálnak.
hacsak a global
használatával kifejezetten nincs megadva, a globális név helyi névtérben történő újbóli hozzárendelése új helyi változót hoz létre ugyanazzal a névvel. Ez nyilvánvaló a következő kódból.
belül mind a outer_func()
, mind a inner_func()
a_num
globális változónak lett nyilvánítva. Csak egy másik értéket állítunk be ugyanarra a globális változóra. Ez az oka annak, hogy a a_num
értéke minden helyen 20. Másrészt minden függvény létrehozza a sajátb_num
változóját egy helyi hatókörrel, és aprint()
függvény kinyomtatja ennek a lokálisan ható változónak az értékét.
modulok megfelelő importálása
a fejlesztés felgyorsítása érdekében nagyon gyakori külső modulok importálása a projektekbe. A modulok importálásának három különböző módja van. Ebben a részben megtudhatja ezeket a módszereket, részletesen megvitatva azok előnyeit és hátrányait.
-
from module import *
: Ez a modulimportálási módszer az adott modul összes nevét közvetlenül az aktuális névtérbe importálja. Kísértésbe eshet ennek a módszernek a használata, mert lehetővé teszi egy funkció közvetlen használatát anélkül, hogy előtagként hozzáadná a modul nevét. Azonban nagyon hibára hajlamos, és elveszíti azt a képességét is, hogy megmondja, melyik modul importálta ezt a funkciót. Íme egy példa ennek a módszernek a használatára:
Ha ismeri a math és a cmath modulokat, akkor már tudja, hogy van néhány közös név, amely mindkét modulban meg van határozva, de valós és komplex számokra vonatkozik.
mivel a math modul után importáltuk a cmath modult, felülírja ezeknek a közös függvényeknek a függvénydefinícióit a math modulból. Ezért az első log10(125)
valós számot ad vissza, a második log10(125)
komplex számot ad vissza. Nincs mód, hogy használja alog10()
funkciót a math modul most. Még akkor is, ha megpróbálta beírni math.log10(125)
, akkor kap egy NameError kivételt, mert math
valójában nem létezik a névtérben.
a lényeg az, hogy nem szabad ezt a módszert használni a függvények különböző modulokból történő importálására, csak néhány billentyűleütés mentésére.
-
from module import nameA, nameB
: ha tudja, hogy csak egy vagy két nevet fog használni egy modulból, közvetlenül importálhatja őket ezzel a módszerrel. Így tömörebben írhatja a kódot, miközben továbbra is minimálisra csökkenti a névtér szennyezését. Ne feledje azonban, hogy továbbra sem használhat más nevet a modulból amodule.nameZ
használatával. Bármely függvény, amelynek azonos neve van a programban, felülírja a modulból importált függvény definícióját is. Ez használhatatlanná teszi az importált funkciót. Íme egy példa ennek a módszernek a használatára:
dir()# from math import log2, log10dir()# log10(125)# 2.0969100130080562
-
import module
: ez a legbiztonságosabb és ajánlott módja egy modul importálásának. Az egyetlen hátránya, hogy a modul nevét előtaggal kell ellátnia a programban használni kívánt összes névhez. Azonban, akkor képes lesz arra, hogy elkerüljék a névtér szennyezés, valamint meghatározza funkciók, amelyek nevét egyezik a nevét funkciók a modulból.
dir()# import mathdir()# math.log10(125)# 2.0969100130080562
végső gondolatok
remélem, hogy ez az oktatóanyag segített megérteni a névtereket és azok fontosságát. Most már képesnek kell lennie arra, hogy meghatározza a különböző nevek körét egy Programban, és elkerülje a lehetséges buktatókat.
Továbbá, ne habozzon, hogy mi van az eladó és a tanulmány a piacon, és ne habozzon feltenni bármilyen kérdést, és adja meg értékes visszajelzést a takarmány alább.
a cikk utolsó szakasza a modulok Pythonban történő importálásának különböző módjait, valamint mindegyikük előnyeit és hátrányait tárgyalta. Ha bármilyen kérdése van ezzel a témával kapcsolatban, kérjük, tudassa velem a megjegyzésekben.
Ismerje meg a Python-t
Ismerje meg a Python-t a teljes python bemutató útmutatónkkal, függetlenül attól, hogy csak most kezded el, vagy tapasztalt kódoló vagy, aki új készségeket szeretne tanulni.