Seite 1 von 1
if __name__ == "main":
Verfasst: Dienstag 19. April 2022, 11:23
von Loster_Paddel
Hallo,
ich habe jetzt schon öfter:
if __name__ == "main":
main()
gesehen und mir wurde schon empfohlen das zu benutzen. Ich haber leider keine Ahnung was das bringt. Ich sehe das oft in Programmen mit Klassen. Ich habe aber mich auch noch nicht mit Klassen beschäftigt.
Ist das oben nur für Klassen und was bringt das?
LG
Re: if __name__ == "main":
Verfasst: Dienstag 19. April 2022, 11:41
von sparrow
Das hat nichts mit Klassen zu tun.
Wenn du ein Modul importierst, dasnn wird der code auf Modulebene ausgeführt. Also all das, was nicht eingerückt ist. Deshalb darf uneingerückt keinerlei Code stehen, außer Importe und die Defintion von Funktionen, Klassen und Konstanten. Immer. In allem, was du in Python schreibst.
Und eben dieser 2 Zeiler.
Der Einstiegspunkt für das Progrramm ist dann per Konvention eine Funkton "main" und der 2 Zeiler ruft eben diese Funktion auf - aber eben nur, wenn das Modul, in dem sie steht, auch das gestartete Modul ist (das prüft die if-Bedingung). Wurde es importiert wird nichts ausgeführt.
Gewöhn es dir gleich richtig an, sonst kommen später viele Situationen, in denen es dir sonst auf die Füße fällt. Zum Beispiel, wenn du mal Tests schreiben möchtest.
Und die konsequente Umsetzung, dass eben keine Variablen oder sonstiger Code auf Modulebene steht, bewahrt dich auch gleich davor, globale Variablen zu verwenden.
Re: if __name__ == "main":
Verfasst: Donnerstag 21. April 2022, 22:48
von _Mala_Fide_
.py Dateien können als Module importiert und als Hauptprogramm aufgerufen werden.
Wird eine .py Datei als Modul importiert, ist __name__ gleich der Name der .py Datei.
Beispiel:
Code: Alles auswählen
#Datei... random.py
import random
print(random.__name__)
#Ausgabe... 'random'
Rufst Du jedoch eine .py Datei als Hauptprogramm auf, bekommt das Attribut __name__ den Wert __main__ zugewiesen.
Alles was in der Bedingung 'if __name__ == "__main__":' steht, wird nur ausgeführt, wenn die .py Datei als Hauptprogramm aufgerufen wird.
Zum beispiel über die Konsole, oder Doppelklick bei Windoof.
So kannst du ein Programm schreiben, was Du als Hauptprogramm starten und von dem Du auch Funktionen, etc. in andere Programme importieren kannst.
Schreibst Du Anweisungen wie z.b. print() außerhalb dieser Bedingung, ganz am Anfang einer Zeile, also ohne Einrückung und importierst diese Datei in ein anderes Programm, wird die print()-Anweisung direkt ausgeführt. Dies kann zu Fehlern bei der Importierung führen, bzw. zu unerwünschtem Verhalten.
Re: if __name__ == "main":
Verfasst: Samstag 23. April 2022, 08:47
von Loster_Paddel
Ich hab mir mal noch ein Video dazu angeschaut, um das veranschaulicht zu haben. Das ist ja eigentlich echt genial. Nur bis jetzt habe ich wenn ich etwas importiert habe immer nur Funktionen zur Übersicht importiert, weswegen ich das bis jetzt auch noch nicht brauchte.
Sollte ich denn dann nicht jedes Programm mit einer if Abrage starten?
LG
Re: if __name__ == "main":
Verfasst: Samstag 23. April 2022, 12:07
von sparrow
Auch wenn du nur eine Funktion aus einem Modul importierst, wird trotzdem das Modul trotzdem vorher ausgeführt.
Zu deiner Frage: Ja, der Einstiegspunkt und der Aufruf von main() ist immer sinnvoll. Kannst du also in jedem Programm machen.