Când un interpret Python citește un fișier Python, acesta stabilește mai întâi câteva variabile speciale. Apoi execută codul din fișier.

Una dintre aceste variabile se numește __name__.

Dacă urmați pas cu pas acest articol și citiți fragmentele de cod ale acestuia, veți învăța cum să utilizați if __name__ == "__main__", și de ce este atât de important.

Module Python explicate

Fișierele Python se numesc module și sunt identificate prin .py extensie de fișier. Un modul poate defini funcții, clase și variabile.

Deci, atunci când interpretul rulează un modul, __name__ variabila va fi setată ca __main__ dacă modulul care se execută este programul principal.

Dar dacă codul importă modulul dintr-un alt modul, atunci fișierul __name__ variabila va fi setată la numele modulului respectiv.

Să aruncăm o privire la un exemplu. Creați un modul Python numit file_one.py și lipiți acest cod de nivel superior în interiorul:

# Python file one module

print("File one __name__ is set to: {}" .format(__name__))
file_one.py

Rulând acest fișier veți vedea exact despre ce vorbeam. Variabila __name__ pentru acest modul este setat la __main__:

File one __name__ is set to: __main__

Acum adăugați un alt fișier numit file_two.py și lipiți acest cod în interiorul:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))
file_two.py

De asemenea, modificați codul în file_one.py așa că importăm file_two modul:

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))
file_one.py

Rularea noastră file_one din nou codul va arăta că __name__ variabilă în file_one nu s-a schimbat și încă rămâne setat la __main__. Dar acum variabila __name__ în file_two este setat ca numele modulului său, prin urmare file_two.

Rezultatul ar trebui să arate astfel:

File two __name__ is set to: file_two
File one __name__ is set to: __main__

Dar fugi file_two direct și veți vedea că numele său este setat la __main__:

File two __name__ is set to: __main__

Variabila __name__ pentru fișierul / modulul care se execută va fi întotdeauna __main__. Cu exceptia __name__ variabila pentru toate celelalte module care sunt importate va fi setată la numele modulului lor.

Convenții de denumire a fișierelor Python

Modul obișnuit de utilizare __name__ și __main__ arata asa:

if __name__ == "__main__":
   Do something here

Să vedem cum funcționează acest lucru în viața reală și cum să folosim efectiv aceste variabile.

Modifica file_one și file_two sa arate asa:

file_one:

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported")
file_one.py

file_two:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
file_two.py

Din nou, când alergi file_one veți vedea că programul a recunoscut care dintre aceste două module este __main__ și am executat codul conform primului nostru if else declarații.

Rezultatul ar trebui să arate astfel:

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly

Acum fugiți file_two și veți vedea că __name__ variabila este setată la __main__:

File two __name__ is set to: __main__
File two executed when ran directly

Când sunt importate și rulate module ca acesta, funcțiile lor vor fi importate și codul de nivel superior executat.

Pentru a vedea acest proces în acțiune, modificați fișierele pentru a arăta astfel:

file_one:

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported")
file_one.py

file_two:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")

Acum funcțiile sunt încărcate, dar nu rulează.

Pentru a rula una dintre aceste funcții modificați fișierul if __name__ == "__main__" parte din file_one sa arate asa:

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
else:
   print("File one executed when imported")

La alergare file_one ar trebui să vedeți ar trebui să fie așa:

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed

De asemenea, puteți rula funcții din fișiere importate. Pentru a face acest lucru, modificați fișierul if __name__ == “__main__” parte din file_one sa arate asa:

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   file_two.function_three()
else:
   print("File one executed when imported")

Și vă puteți aștepta la un rezultat de genul acesta:

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed
Function three is executed

Acum să spunem file_two modulul este foarte mare, cu multe funcții (două în cazul nostru) și nu doriți să le importați pe toate. Modifica file_two sa arate asa:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

def function_four():
   print("Function four is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
file_two.py

Și pentru a importa funcțiile specifice din modul, utilizați from bloc de import în file_one fişier:

# Python module to execute
from file_two import function_three

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   function_three()
else:
   print("File one executed when imported")
file_one.py

Concluzie

Există un caz de utilizare foarte frumos pentru __name__ variabilă, indiferent dacă doriți un fișier care poate fi rulat ca program principal sau importat de alte module. Putem folosi un if __name__ == "__main__" bloc pentru a permite sau a preveni executarea unor părți de cod la importul modulelor.

Când interpretul Python citește un fișier, fișierul __name__ variabila este setată ca __main__ dacă modulul este rulat sau ca nume al modulului dacă este importat. Citirea fișierului execută toate codurile de nivel superior, dar nu funcțiile și clasele (deoarece vor fi importate numai).

Bra gjort! (Asta înseamnă „Bravo” în suedeză!)

Vedeți mai multe articole de acest gen în profilul meu Routech, Profil mediu, și alte lucruri distractive pe care le construiesc pe ale mele Pagina GitHub.