Python if __name__ == __main__ Erklärt mit Codebeispielen

Wenn ein Python-Interpreter eine Python-Datei liest, werden zunächst einige spezielle Variablen festgelegt. Dann führt es den Code aus der Datei aus.

Eine dieser Variablen wird aufgerufen __name__.

Wenn Sie diesem Artikel Schritt für Schritt folgen und seine Codefragmente lesen, erfahren Sie, wie Sie ihn verwenden if __name__ == "__main__"und warum er so wichtig ist.

Python-Module erklärt

Python-Dateien werden als Module bezeichnet und durch die .pyDateierweiterung gekennzeichnet. Ein Modul kann Funktionen, Klassen und Variablen definieren.

Wenn der Interpreter ein Modul ausführt, wird die __name__Variable so gesetzt, als   __main__ob das Modul, das ausgeführt wird, das Hauptprogramm ist.

Wenn der Code das Modul jedoch von einem anderen Modul importiert, wird die __name__  Variable auf den Namen dieses Moduls gesetzt.

Schauen wir uns ein Beispiel an. Erstellen Sie ein Python-Modul mit dem Namen file_one.pyund fügen Sie diesen Code der obersten Ebene ein:

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

Wenn Sie diese Datei ausführen, sehen Sie genau, worüber wir gesprochen haben. Die Variable __name__für dieses Modul lautet __main__:

File one __name__ is set to: __main__

Fügen Sie nun eine weitere Datei mit dem Namen hinzu file_two.pyund fügen Sie diesen Code ein:

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

Ändern Sie den Code auch file_one.pyso, dass wir das file_twoModul importieren :

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

Wenn Sie unseren file_oneCode erneut ausführen, wird angezeigt, dass sich die __name__Variable in file_onenicht geändert hat und weiterhin auf gesetzt bleibt __main__. Jetzt wird die Variable __name__in file_twoals Modulname festgelegt file_two.

Das Ergebnis sollte folgendermaßen aussehen:

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

Wenn file_twoSie jedoch direkt ausführen , wird der Name wie folgt festgelegt __main__:

File two __name__ is set to: __main__ 

Die Variable __name__für die Datei / das Modul, die bzw. das ausgeführt wird, ist immer __main__. Die __name__Variable für alle anderen Module, die importiert werden, wird jedoch auf den Namen ihres Moduls festgelegt.

Namenskonventionen für Python-Dateien

Die übliche Art zu verwenden __name__und __main__sieht so aus:

if __name__ == "__main__": Do something here 

Mal sehen, wie das im wirklichen Leben funktioniert und wie diese Variablen tatsächlich verwendet werden.

Ändern file_oneund file_twoso aussehen:

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

Beim Ausführen werden file_oneSie erneut feststellen, dass das Programm erkannt hat, welches dieser beiden Module es ist, __main__und den Code gemäß unseren ersten if elseAnweisungen ausgeführt hat.

Das Ergebnis sollte folgendermaßen aussehen:

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 

Führen file_twoSie nun aus und Sie werden sehen, dass die __name__Variable auf Folgendes gesetzt ist __main__:

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

Wenn Module wie dieses importiert und ausgeführt werden, werden ihre Funktionen importiert und Code der obersten Ebene ausgeführt.

Ändern Sie Ihre Dateien folgendermaßen, um diesen Vorgang in Aktion zu sehen:

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

Jetzt werden die Funktionen geladen, aber nicht ausgeführt.

Um eine dieser Funktionen auszuführen, ändern Sie den if __name__ == "__main__"Teil von folgendermaßen file_one:

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

Beim Laufen file_onesollte man sehen wie folgt aussehen:

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 

Sie können auch Funktionen aus importierten Dateien ausführen. Ändern Sie dazu den if __name__ == “__main__”Teil von so file_one, dass er folgendermaßen aussieht:

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

Und Sie können ein Ergebnis wie dieses erwarten:

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 

Nehmen wir jetzt an, das file_twoModul ist sehr groß mit vielen Funktionen (in unserem Fall zwei), und Sie möchten nicht alle importieren. Ändern Sie file_twodies so:

# 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.