Python, ha __name__ == __main__ Kódpéldákkal magyarázható

Amikor a Python tolmács Python fájlt olvas, először néhány speciális változót állít be. Ezután végrehajtja a kódot a fájlból.

Az egyik ilyen változót hívjuk __name__.

Ha lépésről lépésre követi ezt a cikket, és elolvassa a kódrészleteket, megtudhatja, hogyan kell használni if __name__ == "__main__", és miért olyan fontos.

Python modulok magyarázata

A Python fájlokat moduloknak nevezik, és a .pyfájlkiterjesztés azonosítja őket . Egy modul meghatározhatja a függvényeket, osztályokat és változókat.

Tehát amikor a tolmács futtat egy modult, a __name__változó úgy lesz beállítva,   __main__mintha a futtatott modul lenne a fő program.

De ha a kód egy másik modulból importálja a modult, akkor a __name__  változó az adott modul nevére lesz állítva.

Nézzünk meg egy példát. Hozzon létre egy Python modult, file_one.pyés nevezze be ezt a legfelső szintű kódot:

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

A fájl futtatásával pontosan meglátja, miről beszéltünk. A __name__modul változója __main__:

File one __name__ is set to: __main__

Most adjon hozzá egy másik nevű fájlt, file_two.pyés illessze be ezt a kódot:

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

Ezenkívül módosítsa a kódot file_one.pyígy, hogy importáljuk a file_twomodult:

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

A file_onekódunk ismételt futtatása megmutatja, hogy a __name__változó file_onenem változott, és továbbra is a (z) értékre van állítva __main__. De most az __name__in változó file_twomodulnévként van beállítva, ezért file_two.

Az eredménynek így kell kinéznie:

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

De futtassa file_twoközvetlenül, és látni fogja, hogy a neve a következőre van állítva __main__:

File two __name__ is set to: __main__ 

A __name__futtatott fájl / modul változója mindig az lesz __main__. De az __name__összes többi importált modul változója a modul nevére lesz beállítva.

Python fájlnevezési konvenciók

A szokásos használati mód, __name__és így __main__néz ki:

if __name__ == "__main__": Do something here 

Lássuk, hogyan működik ez a való életben, és hogyan lehet ezeket a változókat ténylegesen használni.

Módosítsa file_oneés file_twoígy nézzen ki:

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

Ismét futtatásakor file_onelátni fogja, hogy a program felismerte, hogy melyik a két modul, __main__és végrehajtotta a kódot az első if elseállításaink szerint.

Az eredménynek így kell kinéznie:

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 

Most futtassa, file_twoés látni fogja, hogy a __name__változó értéke __main__:

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

Az ilyen modulok importálásakor és futtatásakor a funkcióik importálódnak, és a legfelső szintű kód futtatásra kerül.

A folyamat működésének megtekintéséhez módosítsa a fájlokat a következőképpen:

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

Most a funkciók betöltődnek, de nem futnak.

Ezen funkciók egyikének futtatásához módosítsa a következő if __name__ == "__main__"részét file_one:

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

Futáskor a következőnek file_onekell lennie:

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 

Az importált fájlokból is futtathat függvényeket. Ehhez módosítsa a következő if __name__ == “__main__”részét file_one:

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

És számíthat ilyen eredményre:

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 

Tegyük fel, hogy a file_twomodul valóban nagy, sok funkcióval (esetünkben kettővel), és nem akarja mindegyiket importálni. Módosítsa, file_twohogy így nézzen ki:

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

Check out more articles like this on my freeCodeCamp profile, Medium profile, and other fun stuff I build on my GitHub page.