Python if __name__ == __main__ Vysvetlené s príkladmi kódu

Keď tlmočník Pythonu číta súbor Pythonu, najskôr nastaví niekoľko špeciálnych premenných. Potom vykoná kód zo súboru.

Jedna z týchto premenných sa volá __name__.

Ak budete postupovať podľa tohto článku podrobne a prečítate si jeho útržky kódu, dozviete sa, ako používať if __name__ == "__main__"a prečo je to také dôležité.

Vysvetlenie modulov Python

Súbory Pythonu sa nazývajú moduly a sú identifikované podľa .pyprípony súboru. Modul môže definovať funkcie, triedy a premenné.

Keď teda tlmočník spustí modul, __name__premenná sa nastaví, akoby   __main__bol práve spustený modul hlavným programom.

Ak ale kód importuje modul z iného modulu, __name__  premenná sa nastaví na názov tohto modulu.

Pozrime sa na príklad. Vytvorte modul Python s názvom file_one.pya vložte tento kód najvyššej úrovne dovnútra:

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

Spustením tohto súboru uvidíte presne to, o čom sme hovorili. Premenná __name__pre tento modul je nastavená na __main__:

File one __name__ is set to: __main__

Teraz pridajte ďalší pomenovaný súbor file_two.pya vložte tento kód dovnútra:

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

Upravte tiež kód file_one.pytak, aby sme importovali file_twomodul:

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

file_oneOpätovné spustenie nášho kódu ukáže, že __name__premenná v sa file_onenezmenila a stále zostáva nastavená na __main__. Teraz je však premenná __name__v file_twonastavená ako názov modulu file_two.

Výsledok by mal vyzerať takto:

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

Ale spustite file_twopriamo a uvidíte, že jeho názov je nastavený na __main__:

File two __name__ is set to: __main__ 

Premenná __name__pre spustený súbor / modul bude vždy __main__. Ale __name__variabilné pre všetky ostatné moduly, ktoré sa dovážajú bude nastavená na meno ich modulu.

Konvencie pre pomenovanie súborov v Pythone

Obvyklý spôsob použitia __name__a __main__vyzerá takto:

if __name__ == "__main__": Do something here 

Pozrime sa, ako to funguje v reálnom živote a ako tieto premenné skutočne použiť.

Upravte file_onea file_twovyzerajte takto:

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

Po spustení file_oneopäť uvidíte, že program rozpoznal, ktorý z týchto dvoch modulov je, __main__a vykonal kód podľa našich prvých if elsepríkazov.

Výsledok by mal vyzerať takto:

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 

Teraz spustite file_twoa uvidíte, že __name__premenná je nastavená na __main__:

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

Pri importovaní a spustení takýchto modulov sa importujú ich funkcie a spustí sa kód najvyššej úrovne.

Ak chcete vidieť tento proces v akcii, upravte súbory tak, aby vyzerali takto:

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

Teraz sú funkcie načítané, ale nie sú spustené.

Ak chcete spustiť jednu z týchto funkcií, upravte jej if __name__ == "__main__"časť tak, file_oneaby vyzerala takto:

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

Pri behu file_oneby ste mali vidieť asi takto:

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 

Môžete tiež spustiť funkcie z importovaných súborov. Ak to chcete urobiť, upravte jeho if __name__ == “__main__”časť tak, file_oneaby vyzerala takto:

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

A môžete očakávať takýto výsledok:

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 

Teraz povedzme, že file_twomodul je skutočne veľký a má veľa funkcií (v našom prípade dve) a nechcete importovať všetky. Upraviť tak, file_twoaby vyzeralo takto:

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

Pozrite si ďalšie podobné články na mojom profile freeCodeCamp, strednom profile a ďalších zábavných veciach, ktoré staviam na svojej stránke GitHub.