Articles

Co Jsou Jmenné Prostory Pythonu (A Proč Jsou Potřeba?)

konflikty jmen se v reálném životě dějí neustále. Například, každá škola, do které jsem kdy chodil, měla ve své třídě alespoň dva studenty, kteří sdíleli stejné křestní jméno. Kdyby někdo přišel do třídy a požádal o studenta X, nadšeně bychom se zeptali, „o kterém to mluvíš?“? Existují dva studenti jménem X. “ poté by nám dotazující osoba dala příjmení a my bychom ho představili pravému X.

veškerý tento zmatek a proces určování přesné osoby, o které mluvíme, hledáním dalších informací kromě křestního jména by se dalo vyhnout, kdyby každý měl jedinečné jméno. To není problém ve třídě 30 studentů. Bude však stále obtížnější přijít s jedinečným, smysluplným a snadno zapamatovatelným jménem pro každé dítě ve škole, městě, městě, zemi nebo na celém světě. Dalším problémem při poskytování jedinečného jména každému dítěti je to, že proces určování, zda někdo jiný také pojmenoval své dítě Macey, Maci nebo Macie by mohly být velmi únavné.

velmi podobný konflikt může nastat také v programování. Když píšete program o pouhých 30 řádcích bez vnějších závislostí, je velmi snadné dát všem proměnným jedinečná a smysluplná jména. Problém nastává, když jsou v programu tisíce řádků a také jste načetli některé externí moduly. V tomto tutoriálu se dozvíte o jmenných prostorech, jejich významu a rozlišení rozsahu v Pythonu.

co jsou jmenné prostory?

jmenný prostor je v podstatě systém, který zajišťuje, že všechna jména v programu jsou jedinečná a mohou být použita bez jakéhokoli konfliktu. Možná už víte, že vše v Pythonu-jako řetězce, seznamy, funkce, atd.- je to předmět. Dalším zajímavým faktem je, že Python implementuje jmenné prostory jako slovníky. K dispozici je mapování název-objekt, s názvy jako klíče a objekty jako hodnoty. Více jmenných prostorů může používat stejný název a mapovat jej na jiný objekt. Zde je několik příkladů jmenných prostorů:

  • místní Jmenný prostor: Tento jmenný prostor obsahuje místní názvy uvnitř funkce. Tento jmenný prostor je vytvořen při volání funkce a trvá pouze do návratu funkce.
  • Globální Jmenný prostor: tento jmenný prostor obsahuje názvy z různých importovaných modulů, které používáte v projektu. Je vytvořen, když je modul součástí projektu a trvá až do konce skriptu.
  • vestavěný Jmenný prostor: tento jmenný prostor obsahuje vestavěné funkce a vestavěné názvy výjimek.

v matematických modulech řady Python na Envato Tuts+ jsem psal o užitečných matematických funkcích dostupných v různých modulech. Například, matematika a cmath moduly mají mnoho funkcí, které jsou společné pro oba z nich, jako log10()acos()cos()exp(), atd. Pokud používáte oba tyto moduly ve stejném programu, jediný způsob, jak tyto funkce používat, jednoznačně je, aby je prefix název modulu, jako math.log10()cmath.log10().

co je rozsah?

Jmenné prostory nám pomáhají jednoznačně identifikovat všechna jména uvnitř programu. To však neznamená, že můžeme použít název proměnné kdekoli chceme. Název má také rozsah, který definuje části programu, kde můžete použít tento název bez použití jakékoli předpony. Stejně jako jmenné prostory, v programu je také více oborů. Zde je seznam některých oborů, které mohou existovat během provádění programu.

  • lokální rozsah, což je nejvnitřnější rozsah, který obsahuje seznam místních názvů dostupných v aktuální funkci.
  • rozsah všech uzavíracích funkcí. Hledání názvu začíná od nejbližšího ohraničujícího rozsahu a pohybuje se směrem ven.
  • rozsah úrovně modulu, který obsahuje všechny globální názvy z aktuálního modulu.
  • nejvzdálenější rozsah, který obsahuje seznam všech vestavěných jmen. Tento rozsah je prohledán jako poslední, aby našel název, na který jste odkazovali.

v následujících částech tohoto tutoriálu budeme rozsáhle používat vestavěnou funkci Python dir() k vrácení seznamu jmen v aktuálním lokálním rozsahu. To vám pomůže pochopit pojem jmenných prostorů a rozsahu jasněji.

rozlišení rozsahu

Jak jsem zmínil v předchozí části, Hledání daného jména začíná od nejvnitřnější funkce a poté se pohybuje výš a výš, dokud program nemůže mapovat toto jméno na objekt. Pokud se v žádném jmenném prostoru nenachází žádný takový název, program vyvolá výjimku NameError.

než začneme, zkuste zadat dir() v IDLE nebo jiném Pythonu IDE.

dir()# 

podívejme se na výstup dir() funkce po definování proměnné a funkce.

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

funkce dir() vypíše pouze seznam jmen uvnitř aktuálního rozsahu. Proto v rámci some_func() existuje pouze jeden název nazvaný b_num. Volání dir() po definování some_func() přidá do seznamu jmen dostupných v globálním jmenném prostoru.

nyní se podívejme na seznam jmen uvnitř některých vnořených funkcí. Kód v tomto bloku pokračuje z předchozího bloku.

výše uvedený kód definuje dvě proměnné a funkci uvnitř rozsahu outer_func(). Uvnitř inner_func() funkcedir() vytiskne pouze název d_num. To se zdá být spravedlivé, protože d_num je jediná proměnná, která je zde definována.

není-li výslovně uvedeno pomocí global, přiřazení globální jméno uvnitř místních názvů vytvoří novou lokální proměnnou se stejným názvem. To je zřejmé z následujícího kódu.

Uvnitř outer_func()inner_func()a_num prohlášena za globální proměnné. Pouze nastavujeme jinou hodnotu pro stejnou globální proměnnou. To je důvod, proč hodnota a_num na všech místech je 20. Na druhou stranu, každá funkce vytváří své vlastní b_num proměnné s místní působnosti, a print() funkce vytiskne hodnotu tohoto místně scoped proměnné.

správně Importujte moduly

pro urychlení vývoje je velmi běžné importovat externí moduly do vašich projektů. Existují tři různé způsoby importu modulů. V této části se dozvíte o všech těchto metodách a podrobně diskutujete o jejich výhodách a nevýhodách.

  • from module import *: Tento způsob importu modulu importuje všechny názvy z daného modulu přímo do aktuálního jmenného prostoru. Můžete být v pokušení použít tuto metodu, protože vám umožňuje používat funkci přímo bez přidání názvu modulu jako předpony. Je však velmi náchylný k chybám a také ztratíte schopnost zjistit, který modul tuto funkci skutečně importoval. Zde je příklad použití této metody:

Pokud jste obeznámeni s moduly math a cmath, již víte, že existuje několik běžných názvů, které jsou definovány v obou těchto modulech, ale vztahují se na reálná a komplexní čísla.

protože jsme importovali modul cmath po matematickém modulu, přepíše definice funkcí těchto běžných funkcí z matematického modulu. Proto první log10(125) vrací reálné číslo a druhé log10(125) vrací komplexní číslo. Neexistuje žádný způsob, jak použít log10() funkce z matematického modulu nyní. I když jste se snažil psát math.log10(125), dostanete NameError výjimkou, protože math ve skutečnosti neexistuje v oboru názvů.

pointa je, že byste neměli používat tento způsob importu funkcí z různých modulů, jen proto, aby ušetřit pár úhozů.

  • from module import nameA, nameB: Pokud víte, že jste jen bude používat jednu nebo dvě jména z modulu, můžete je importovat přímo pomocí této metody. Tímto způsobem můžete psát kód výstižněji a přitom udržovat znečištění jmenného prostoru na minimu. Mějte však na paměti, že stále nemůžete použít žádný jiný název z modulu pomocí module.nameZ. Každá funkce, která má ve vašem programu stejný název, také přepíše definici této funkce importované z modulu. Díky tomu bude importovaná funkce nepoužitelná. Zde je příklad použití této metody:
dir()# from math import log2, log10dir()# log10(125)# 2.0969100130080562
  • import module: Toto je nejbezpečnější a doporučený způsob importu modulu. Jedinou nevýhodou je, že budete muset prefixovat název modulu na všechna jména, která budete v programu používat. Budete se však moci vyhnout znečištění jmenného prostoru a také definovat funkce, jejichž názvy odpovídají názvu funkcí z modulu.
dir()# import mathdir()# math.log10(125)# 2.0969100130080562

Závěrečné myšlenky

doufám, že vám tento tutoriál pomohl pochopit jmenné prostory a jejich význam. Nyní byste měli být schopni určit rozsah různých jmen v programu a vyhnout se potenciálním nástrahám.

Navíc, neváhejte se podívat, co máme k dispozici pro prodej a pro studium na trhu, a neváhejte se zeptat nějaké otázky, a poskytnout své cennou zpětnou vazbu pomocí krmiva níže.

závěrečná část článku diskutovala o různých způsobech importu modulů v Pythonu a výhodách a nevýhodách každého z nich. Máte-li jakékoli dotazy týkající se tohoto tématu, dejte mi prosím vědět v komentářích.

Naučte se Python

Naučte se Python s naší kompletní python tutorial průvodce, zda jste právě začínáte, nebo jste zkušený kodér snaží naučit se nové dovednosti.