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 .pyfiltypen. 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.pyog 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.pyog 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.pydenne måde, så vi importerer file_twomodulet:

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) 

At køre vores file_onekode igen viser, at __name__variablen i den file_oneikke ændrede sig, og stadig er sat til __main__. Men nu er variablen __name__i file_twoindstillet 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_twodirekte, 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_oneog file_twose 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 elseudsagn.

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_twoog 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_oneat 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_onedu 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_oneat 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_twomodulet er virkelig stort med mange funktioner (to i vores tilfælde), og du vil ikke importere dem alle. Modificer for file_twoat 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.