Frage zur main() Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lukas_25025
User
Beiträge: 13
Registriert: Sonntag 16. Mai 2021, 10:20

Könnte mir jemand den Sinn und die Verwendung der main() Funktion erklären?
Und wie kommt dieses beim aufrufen nötige

Code: Alles auswählen

if __name__ = __main()__:
zustande?
LG
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ganz einfach: außer Konstanten, Importen, Funktionen und Klassen hat nichts auf oberster Ebene zu stehen. Vor allem also kein Code, der schon gleich ausgeführt wird. Und dann oft auch die verpönten globalen Variablen anlegt. Darum nutzt man ein main. Der gezeigte main-guard ist optional, aber guter Stil, weil man damit verhindert, dass main aufgerufen wird, auch wenn man die Datei als Modul importiert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Code den du zeigst ist falsch. Richtig wäre dies:

Code: Alles auswählen

if __name__ == "__main__":
Um die Funktionsweise des ganzen nochmal zu erläutern: __name__ ist eine spezielle Variable mit dem Namen des aktuellen Moduls. Wenn du eine Datei hast mit Namen `foo.py` hat `__name__` innerhalb dieses Moduls den Wert `"foo"` wenn es importiert wird aber `"__main__"` wenn es direkt ausgeführt wird.

Beispiel:

Code: Alles auswählen

$ cat -p foo.py 
print("__name__:", __name__)
if __name__ == "__main__":
    print("main")

$ python foo.py 
__name__: __main__
main

$ python
Python 3.9.1 (default, Mar  3 2021, 16:34:40) 
[Clang 12.0.0 (clang-1200.0.31.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
__name__: foo
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Könnte mir jemand den Sinn und die Verwendung der main() Funktion erklären?
Das ist keine main Funktion sondern ein "import guard"
Es wird verwended um zu verhinden das code aus diesem Modul beim Import aus geführt wird.

__name__ ist eine interne Variable die entweder den Namen des Moduls enthält wenn es importiert wurde, oder "__main__" enthält wenn das entsprechende modul direkt ausgrführt wurde.

Beispiel:

Das Modul utilities.py

Code: Alles auswählen

print(__name__)
und das Modul program.py

Code: Alles auswählen

import utilities
Führt man utilities.py direkt aus, wird "__main__" ausgegeben.
Führt man program.py aus, wird "utilities" ausgegeben.

Das verdeutlicht, das es zu jedem modul ein __name__ gibt, welches je nachdem wie es aufgerufen wurde, unterschiedliche Werte enthalten kann.

Das mact man sich zu nutze, indem man im "import guard" Code platziert den man nur bei direktem Aufruf ausführen will:

Code: Alles auswählen

if __name__ == "__main__":
    print("Ich werde nur direkt, aber nicht beim import ausgeführt")
Antworten