Určitě jste se v Pythonu setkali s konstrukcí if __name__ == "hlavní". Znáte ale jeho přesný účel?

V některých programovacích jazycích slouží hlavní metoda jako jediný vstupní bod pro provádění programu. Při přechodu z jiných jazyků na Python se idiom if __name__ == "__main__" může se zdát, že plní stejný úkol. V Pythonu tomu tak není.

The if __name__ == "__main__" idiom umožňuje spuštění specifického kódu, když soubor běží jako skript. Také zajišťuje, že se při importu souboru jako modulu nespustí stejný kód.

Pochopení chování proměnné __name__

The __název__ proměnná je zabudována do Pythonu. Představuje název modulu nebo skriptu, ve kterém je použit. Když se skript spustí jako hlavní program, jeho hodnota je nastavena na __hlavní__. Pokud skript importujete jako modul, hodnota proměnné se nastaví na skutečný název modulu.

To může být zpočátku matoucí, ale podívejte se na následující příklad:

Vytvořte skript a pojmenujte jej pozdravy.py. Tento skript bude obsahovat funkci, která pozdraví uživatele a vypíše hodnotu __název__ variabilní. Také požádá uživatele, aby zadal své jméno.

defpozdravit(název):
tisk(f" Dobrý den, {název}!")

tisk("Hodnota __name__:", __název__)

-li __jméno__ == "__hlavní__":
uživatelské_jméno = vstup("Zadejte prosím své jméno:")
pozdravit (uživatelské_jméno)
jiný:
tisk("Modul 'pozdravy' byl importován.")

Spuštění pozdravy.py skript zobrazí následující výstup:

Hodnota __název__ variabilní výnosy jako __hlavní__ protože skript se spouští přímo.

Nyní vytvořte další skript a pojmenujte jej skript2.py. Poté importujte Pozdravy skript jako modul.

import Pozdravy

tisk("Provádění skriptu pozdravů...")
zdravím.zdravím("Alice")

Volání na pozdravit funkce z Pozdrav modul poskytuje následující výstup.

Hodnota __název__ proměnná se změní na skutečný název importovaného modulu. V tomto případě, Pozdravy.

Tato hodnota je tím idiomem if __name__ == "__main__" hledá, aby zjistil, zda je soubor spuštěn jako skript nebo je importován jako modul.

Kdy použít if __name__ == "__main__" konstrukt?

Můžete přidat if __name__ == "__main__" konstruovat v libovolném skriptu. Existují však některé scénáře, kdy může být jeho použití nejvýhodnější. O těchto scénářích se dozvíte pomocí jednoduchého programu kalkulačky níže.

# kalkulačka.py

defpřidat(a, b):
vrátit se a + b

defodčítat(a, b):
vrátit se a - b

defnásobit(a, b):
vrátit se a * b

defrozdělit(a, b):
-li b != 0:
vrátit se a/b
jiný:
vrátit se"Chyba: Dělení nulou!"

-li __jméno__ == "__hlavní__":
tisk("Vítejte v kalkulačce!")
tisk("Vyberte operaci:")
tisk("1. Přidat")
tisk("2. Odčítat")
tisk("3. Násobit")
tisk("4. Rozdělit")

volba = int (vstup("Zadejte svou volbu (1-4): "))

číslo1 = plovoucí (vstup("Zadejte první číslo: "))
num2 = float (vstup("Zadejte druhé číslo: "))

-li výběr == 1:
výsledek = přidat (číslo1, číslo2)
tisk(f"Součet {číslo1} a {num2} je: {výsledek}")
elif výběr == 2:
výsledek = odečíst (číslo1, číslo2)
tisk(f „Rozdíl mezi {číslo1} a {num2} je: {výsledek}")
elif výběr == 3:
výsledek = násobit (číslo1, číslo2)
tisk(f"Produkt {číslo1} a {num2} je: {výsledek}")
elif výběr == 4:
výsledek = dělit (číslo1, číslo2)
tisk(f"Rozdělení {číslo1} podle {num2} je: {výsledek}")
jiný:
tisk("Neplatná volba!")

První scénář je, když chcete spustit skript nezávisle a provést konkrétní akce. To umožňuje skriptu fungovat jako samostatný program. The if __name__ == "__main__" konstrukt umožňuje uživatelům komunikovat s kalkulačkou pomocí rozhraní příkazového řádku. To dává uživatelům možnost používat funkce programu, aniž by museli rozumět nebo upravovat základní kód.

Stále je možné spustit program bez if __name__ == "__main__" vytvořit a dosáhnout stejného výsledku, ale váš kód by ztratil modulární organizaci kódu.

Druhý scénář je, když chcete svůj kód, aby měl modulární design. To umožňuje ostatním programům importovat váš skript jako modul a používat jeho funkce bez spouštění zbytečných funkcí.

V případě programu kalkulačka mohou jiné programy importovat kalkulačka modulu bez spouštění rozhraní CLI a uživatelských vstupních výzev. To zajišťuje opětovnou použitelnost kódu a modulární design. Umožňuje tak bezproblémovou integraci kalkulačky do větších aplikací.

import kalkulačka

# Použití funkcí z modulu kalkulačky
result_add = calculator.add(5, 3)
tisk("Výsledek přidání:", result_add)

result_subtract = calculator.subtract(10, 4)
tisk("Výsledek odčítání:", výsledek_odečíst)

Třetí scénář je, když chcete otestujte a odlaďte svůj skript Python nezávisle na jakýchkoli jiných modulech nebo skriptech, které by jej mohly importovat. V příkladu s kalkulačkou to usnadňuje soustředit se na testování funkčnosti kalkulačky bez rušení externím kódem.

import kalkulačka

# Testování funkcí kalkulačky
-li __jméno__ == "__hlavní__":
# Testovací přídavek
výsledek = kalkulačka.přidej(5, 3)
tisk("Výsledek přidání:", výsledek)

# Test odečítání
výsledek = kalkulačka.odečíst(8, 4)
tisk("Výsledek odčítání:", výsledek)

# Test násobení
výsledek = kalkulačka.násobit(2, 6)
tisk("Výsledek násobení:", výsledek)

Výše uvedený kód ukazuje, jak nezávisle ladit skript kalkulačky.

Kdy je zbytečné používat if __name__ == "__main__" konstrukt?

Jak jste viděli ve scénářích výše, použití if __name__ == "__main__" konstruktem je odlišit skript, který spouštíte jako hlavní program, a ten, který importujete jako modul. Existují však případy, kdy je použití zbytečné.

První případ je, když je váš skript jednoduchý a nemá žádné opakovaně použitelné funkce nebo moduly a nemáte v úmyslu jej importovat. V tomto případě byste měli tuto konstrukci vynechat, protože celý skript se při spuštění spustí. To je běžné u jednorázových skriptů, které plní konkrétní účel a nejsou určeny k opětovnému použití nebo importu.

Druhý případ je, když pracujete v interaktivní relaci Pythonu, např. při používání notebooku Jupyter. V interaktivní relaci zadáváte a spouštíte kód přímo v příkazovém řádku nebo v interaktivním prostředí Pythonu. Jako je Python REPL (Read-Eval-Print Loop). To vám umožní experimentovat s kódem a testovat malé úryvky, což vám poskytne okamžité výsledky.

V těchto interaktivních prostředích koncept skriptu spuštěného jako hlavní program nebo importovaného jako modul neplatí. Úryvky kódu spouštíte přímo, aniž byste potřebovali tradiční vstupní bod skriptu.

Jak se můžete stát mistrem v Pythonu?

Chcete-li se stát mistrem v jakémkoli programovacím jazyce, musíte pochopit, jak fungují základní koncepty funkcí nebo nástrojů. Stejně jako jste se dozvěděli o konstrukci if __name__ == "__main__" v tomto článku.

Pochopení základních pojmů vám pomůže přesně vědět, jak se váš program bude chovat, když je použijete. Není kam spěchat, učení se pojmů jeden po druhém vám pomůže ponořit se hlouběji do každého z nich.