Python, jos __nimi__ == __main__ Selitetty koodiesimerkkeillä

Kun Python-tulkki lukee Python-tiedoston, se asettaa ensin muutaman erikoismuuttujan. Sitten se suorittaa koodin tiedostosta.

Yksi näistä muuttujista kutsutaan __name__.

Jos seuraat tätä artikkelia vaihe vaiheelta ja luet sen koodinpätkät, opit käyttämään if __name__ == "__main__"ja miksi se on niin tärkeää.

Python-moduulit selitetty

Python-tiedostoja kutsutaan moduuleiksi, ja ne tunnistetaan .pytiedostopääte. Moduuli voi määritellä funktiot, luokat ja muuttujat.

Joten kun tulkki suorittaa moduulin, __name__muuttuja asetetaan ikään   __main__kuin suoritettava moduuli olisi pääohjelma.

Mutta jos koodi tuo moduulia toisesta moduulista, __name__  muuttuja asetetaan kyseisen moduulin nimeksi.

Katsotaanpa esimerkkiä. Luo Python-moduuli nimeltä file_one.pyja liitä tämä ylätason koodi sisälle:

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

Suorittamalla tämän tiedoston näet tarkalleen, mistä puhuimme. __name__Tämän moduulin muuttuja on asetettu __main__:

File one __name__ is set to: __main__

Lisää nyt toinen tiedosto nimeltä file_two.pyja liitä tämä koodi sisään:

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

Muokkaa myös koodia tällä file_one.pytavoin, jotta tuomme file_twomoduulin:

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

Running file_onekoodi taas osoittaa, että __name__muuttuja file_oneei muuttunut, ja silti pysyy asetettuna __main__. Mutta nyt muuttuja __name__in file_twoon asetettu sen moduulin nimeksi file_two.

Tuloksen pitäisi näyttää tältä:

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

Suorita kuitenkin file_twosuoraan ja näet, että sen nimi on asetettu __main__:

File two __name__ is set to: __main__ 

Suoritettavan __name__tiedoston / moduulin muuttuja on aina __main__. Mutta __name__kaikkien muiden tuotavien moduulien muuttuja asetetaan moduulin nimeksi.

Python-tiedostojen nimeämiskäytännöt

Tavallinen käyttötapa __name__ja __main__näyttää tältä:

if __name__ == "__main__": Do something here 

Katsotaanpa, miten tämä toimii tosielämässä ja kuinka näitä muuttujia todella käytetään.

Muokkaa file_oneja file_twonäytä tältä:

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

Jälleen käynnissä file_onenäet, että ohjelma tunnisti, mikä näistä kahdesta moduulista on, __main__ja suoritti koodin ensimmäisten if elselausumiemme mukaisesti.

Tuloksen pitäisi näyttää tältä:

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 

Suorita nyt file_twoja näet, että __name__muuttuja on asetettu __main__:

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

Kun tällaisia ​​moduuleja tuodaan ja suoritetaan, niiden toiminnot tuodaan ja ylätason koodi suoritetaan.

Jos haluat nähdä tämän prosessin toiminnassa, muokkaa tiedostosi näyttämään tältä:

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

Nyt toiminnot on ladattu, mutta niitä ei käytetä.

Jos haluat suorittaa jonkin näistä toiminnoista, muokkaa sen if __name__ == "__main__"osaa file_onenäyttämään tältä:

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

Juoksun aikana file_onesinun pitäisi nähdä tämän:

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 

Voit myös suorittaa toimintoja tuoduista tiedostoista. Voit tehdä sen muokkaamalla if __name__ == “__main__”osan file_onenäyttämään tältä:

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

Ja voit odottaa tällaista tulosta:

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 

Oletetaan nyt, että file_twomoduuli on todella iso ja siinä on paljon toimintoja (tapauksessamme kaksi), etkä halua tuoda kaikkia. Muokkaa file_twonäyttämään tältä:

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

Katso lisää tällaisia ​​artikkeleita freeCodeCamp-profiilissani, Medium-profiilissani ja muissa hauskoissa asioissa, jotka rakennan GitHub-sivullesi.