Python, ja __name__ == __main__ Paskaidrots ar kodu piemēriem

Kad Python tulks lasa Python failu, tas vispirms iestata dažus īpašus mainīgos. Tad tas izpilda kodu no faila.

Vienu no šiem mainīgajiem sauc __name__.

Soli pa solim sekojot šim rakstam un izlasot tā koda fragmentus, jūs uzzināsiet, kā to izmantot if __name__ == "__main__", un kāpēc tas ir tik svarīgi.

Izskaidroti Python moduļi

Python failus sauc par moduļiem, un tos identificē pēc .pyfaila paplašinājuma. Modulis var definēt funkcijas, klases un mainīgos.

Tātad, kad tulks palaiž moduli, __name__mainīgais tiks iestatīts tā,   __main__it kā palaistais modulis būtu galvenā programma.

Bet, ja kods importē moduli no cita moduļa, __name__  mainīgais tiks iestatīts uz šī moduļa nosaukumu.

Apskatīsim piemēru. Izveidojiet Python moduli ar nosaukumu file_one.pyun ielīmējiet šo augšējā līmeņa kodu:

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

Palaidot šo failu, jūs redzēsiet tieši to, par ko mēs runājām. Šī __name__moduļa mainīgais ir iestatīts uz __main__:

File one __name__ is set to: __main__

Tagad pievienojiet citu failu ar nosaukumu file_two.pyun ielīmējiet šo kodu iekšpusē:

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

Mainiet kodu arī file_one.pyšādi, lai importētu file_twomoduli:

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

file_oneVēlreiz palaižot mūsu kodu, tiks parādīts, ka __name__mainīgais file_onemainījās un joprojām ir iestatīts uz __main__. Bet tagad mainīgais __name__ir file_twoir noteikta kā tās moduļa nosaukumu, līdz ar to file_two.

Rezultātam vajadzētu izskatīties šādi:

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

Bet palaidiet file_twotieši un redzēsiet, ka tā nosaukums ir iestatīts uz __main__:

File two __name__ is set to: __main__ 

Palaižamā __name__faila / moduļa mainīgais vienmēr būs __main__. Bet __name__visu pārējo importēto moduļu mainīgais tiks iestatīts uz viņu moduļa nosaukumu.

Python failu nosaukšanas konvencijas

Parastais lietošanas veids __name__un __main__izskatās šādi:

if __name__ == "__main__": Do something here 

Apskatīsim, kā tas darbojas reālajā dzīvē un kā faktiski izmantot šos mainīgos.

Modificēt file_oneun file_twoizskatīties šādi:

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") 

Atkal, palaižot, file_onejūs redzēsiet, ka programma atpazina, kurš no šiem diviem moduļiem ir, __main__un izpildīja kodu saskaņā ar mūsu pirmajiem if elsepaziņojumiem.

Rezultātam vajadzētu izskatīties šādi:

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 

Tagad palaidiet file_twoun redzēsiet, ka __name__mainīgais ir iestatīts uz __main__:

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

Kad šādi moduļi tiek importēti un palaist, to funkcijas tiks importētas un izpildīts augstākā līmeņa kods.

Lai redzētu šo procesu darbībā, modificējiet failus tā, lai tie izskatās šādi:

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") 

Tagad funkcijas ir ielādētas, bet netiek palaistas.

Lai palaistu kādu no šīm funkcijām, modificējiet if __name__ == "__main__"daļu file_onešādi:

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

Skrienot file_onejums vajadzētu būt šādam:

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 

Varat arī palaist funkcijas no importētiem failiem. Lai to izdarītu, modificējiet if __name__ == “__main__”daļu tā, file_onelai tā izskatās šādi:

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

Un jūs varat sagaidīt šādu rezultātu:

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 

Pieņemsim, ka file_twomodulis ir patiešām liels un ar daudzām funkcijām (mūsu gadījumā divas), un jūs nevēlaties visas importēt. Modificēt, file_twolai izskatās šādi:

# 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!)

Pārbaudiet vairāk līdzīgu rakstu manā freeCodeCamp profilā, Medium profilā un citos jautros materiālos, ko veidoju savā GitHub lapā.