„Python“, jei __name__ == __main__ Paaiškinta kodo pavyzdžiais

Kai „Python“ vertėjas skaito „Python“ failą, jis pirmiausia nustato keletą specialiųjų kintamųjų. Tada jis vykdo kodą iš failo.

Vienas iš tų kintamųjų vadinamas __name__.

Jei atliksite šį straipsnį žingsnis po žingsnio ir perskaitysite jo kodo fragmentus, sužinosite, kaip jį naudoti if __name__ == "__main__"ir kodėl jis toks svarbus.

„Python“ moduliai paaiškinti

„Python“ failai vadinami moduliais ir juos identifikuoja .pyfailo plėtinys. Modulis gali apibrėžti funkcijas, klases ir kintamuosius.

Taigi, kai vertėjas paleidžia modulį, __name__kintamasis bus nustatytas taip,   __main__lyg vykdomas modulis būtų pagrindinė programa.

Bet jei kodas importuoja modulį iš kito modulio, tada __name__  kintamasis bus nustatytas to modulio pavadinimu.

Pažvelkime į pavyzdį. Sukurkite „Python“ modulį pavadinimu file_one.pyir įklijuokite šį aukščiausio lygio kodą:

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

Paleisdami šį failą pamatysite, apie ką tiksliai kalbėjome. Šio __name__modulio kintamasis yra nustatytas __main__:

File one __name__ is set to: __main__

Dabar pridėkite kitą failą pavadinimu file_two.pyir įklijuokite šį kodą:

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

Taip pat pakeiskite kodą file_one.pytaip, kad importuotume file_twomodulį:

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

file_oneDar kartą paleidus mūsų kodą, paaiškės, kad __name__kintamasis file_onenepakito ir vis tiek išlieka nustatytas __main__. Bet dabar kintamasis __name__yra file_twonustatytas kaip jos modulio pavadinimas, taigi file_two.

Rezultatas turėtų atrodyti taip:

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

Bet paleiskite file_twotiesiogiai ir pamatysite, kad jo vardas nustatytas __main__:

File two __name__ is set to: __main__ 

Vykdomo __name__failo / modulio kintamasis bus visada __main__. Bet __name__visų kitų importuojamų modulių kintamasis bus nustatytas pagal jų modulio pavadinimą.

„Python“ failų pavadinimo taisyklės

Įprastas naudojimo būdas __name__ir __main__atrodo taip:

if __name__ == "__main__": Do something here 

Pažiūrėkime, kaip tai veikia realiame gyvenime ir kaip iš tikrųjų naudoti šiuos kintamuosius.

Keisti file_oneir file_twoatrodyti taip:

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

Vėlgi, paleisdami file_onepamatysite, kad programa atpažino, kuris iš šių dviejų modulių yra, __main__ir įvykdė kodą pagal pirmuosius mūsų if elseteiginius.

Rezultatas turėtų atrodyti taip:

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 

Dabar paleiskite file_twoir pamatysite, kad __name__kintamasis nustatytas į __main__:

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

Kai tokie moduliai kaip šis yra importuojami ir vykdomi, jų funkcijos bus importuojamos ir vykdomas aukščiausio lygio kodas.

Norėdami pamatyti šį procesą, pakeiskite failus taip, kad jie atrodytų taip:

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

Dabar funkcijos yra įkeltos, bet neveikia.

Norėdami paleisti vieną iš šių funkcijų, pakeiskite if __name__ == "__main__"dalį taip, file_onekad atrodytų taip:

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

Bėgdami file_oneturėtumėte pamatyti, kad jis turėtų būti toks:

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 

Be to, galite paleisti funkcijas iš importuotų failų. Norėdami tai padaryti, pakeiskite if __name__ == “__main__”dalį taip, file_onekad atrodytų taip:

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

Ir galite tikėtis tokio rezultato:

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 

Tarkime, kad file_twomodulis yra tikrai didelis ir turi daug funkcijų (mūsų atveju dvi), ir jūs nenorite visų jų importuoti. Pakeiskite, file_twokad atrodytumėte taip:

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

Peržiūrėkite daugiau panašių straipsnių savo „freeCodeCamp“ profilyje, „Medium“ profilyje ir kitoje įdomioje medžiagoje, kurią kuriu savo „GitHub“ puslapyje.