Python hvis __name__ == __main__ forklaret med kodeeksempler
Når en Python-tolk læser en Python-fil, indstiller den først et par specielle variabler. Derefter udfører den koden fra filen.
En af disse variabler kaldes __name__
.
Hvis du følger denne artikel trin for trin og læser dens kodestykker, lærer du, hvordan du bruger if __name__ == "__main__"
, og hvorfor den er så vigtig.
Python-moduler forklaret
Python-filer kaldes moduler, og de identificeres af .py
filtypen. Et modul kan definere funktioner, klasser og variabler.
Så når tolken kører et modul, indstilles __name__
variablen, som __main__
om det modul, der køres, er hovedprogrammet.
Men hvis koden importerer modulet fra et andet modul, indstilles __name__
variablen til modulets navn.
Lad os se på et eksempel. Opret et Python-modul med navnet, file_one.py
og indsæt denne øverste niveaukode inde:
# Python file one module print("File one __name__ is set to: {}" .format(__name__))
Ved at køre denne fil vil du se nøjagtigt, hvad vi talte om. Variablen __name__
for dette modul er indstillet til __main__
:
File one __name__ is set to: __main__
Tilføj nu en anden fil med navnet file_two.py
og indsæt denne kode inde:
# Python module to import print("File two __name__ is set to: {}" .format(__name__))
Du skal også ændre koden på file_one.py
denne måde, så vi importerer file_two
modulet:
# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__))
At køre vores file_one
kode igen viser, at __name__
variablen i den file_one
ikke ændrede sig, og stadig er sat til __main__
. Men nu er variablen __name__
i file_two
indstillet som dens modulnavn, derfor file_two
.
Resultatet skal se sådan ud:
File two __name__ is set to: file_two File one __name__ is set to: __main__
Men kør file_two
direkte, og du vil se, at navnet er indstillet til __main__
:
File two __name__ is set to: __main__
Variablen __name__
for den fil / modul, der køres, vil altid være __main__
. Men __name__
variablen for alle andre moduler, der importeres, indstilles til modulets navn.
Python File Naming-konventioner
Den sædvanlige måde at bruge __name__
og __main__
ser sådan ud:
if __name__ == "__main__": Do something here
Lad os se, hvordan dette fungerer i det virkelige liv, og hvordan man rent faktisk bruger disse variabler.
Rediger file_one
og file_two
se sådan ud:
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_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")
Igen, når du kører file_one
, vil du se, at programmet genkendte, hvilket af disse to moduler der er, __main__
og udførte koden ifølge vores første if else
udsagn.
Resultatet skal se sådan ud:
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
Kør nu, file_two
og du vil se, at __name__
variablen er indstillet til __main__
:
File two __name__ is set to: __main__ File two executed when ran directly
Når moduler som dette importeres og køres, importeres deres funktioner og kode på øverste niveau udføres.
For at se denne proces i aktion skal du ændre dine filer for at se sådan ud:
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_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")
Nu er funktionerne indlæst, men ikke kørt.
For at køre en af disse funktioner skal du ændre if __name__ == "__main__"
delen af den for file_one
at se sådan ud:
if __name__ == "__main__": print("File one executed when ran directly") function_two() else: print("File one executed when imported")
Når du kører, skal file_one
du se sådan være:
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
Du kan også køre funktioner fra importerede filer. For at gøre det skal du ændre if __name__ == “__main__”
delen af for file_one
at se sådan ud:
if __name__ == "__main__": print("File one executed when ran directly") function_two() file_two.function_three() else: print("File one executed when imported")
Og du kan forvente et resultat som dette:
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
Lad os sige, at file_two
modulet er virkelig stort med mange funktioner (to i vores tilfælde), og du vil ikke importere dem alle. Modificer for file_two
at se sådan ud:
# 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")
And to import the specific functions from the module, use the from
import block in the file_one
file:
# 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")
Conclusion
There is a really nice use case for the __name__
variable, whether you want a file that can be run as the main program or imported by other modules. We can use an if __name__ == "__main__"
block to allow or prevent parts of code from being run when the modules are imported.
When the Python interpreter reads a file, the __name__
variable is set as __main__
if the module being run, or as the module's name if it is imported. Reading the file executes all top level code, but not functions and classes (since they will only get imported).
Bra gjort! (That means "Well done" in Swedish!)
Tjek flere artikler som denne på min freeCodeCamp-profil, Medium-profil og andre sjove ting, jeg bygger på min GitHub-side.