Seite 1 von 1

if __name__ == "__main__":

Verfasst: Montag 21. September 2009, 22:20
von zenker
Hi,

in diversen Codes lese ich häufiger folgendes Konstrukt:

Code: Alles auswählen

if __name__ == "__main__":
    main()
welchen tiefergehenden Sinn hat das?
Gut, "main()" ist eine Prozedur.
Aber welchen Sinn hat das "if __name..."?

Verfasst: Montag 21. September 2009, 22:24
von Dauerbaustelle
Wenn das aktuelle Modul das "Hauptmodul" ist, d.h. direkt von einem Python-Interpreter gestarted und nicht von einem anderen Modul importiert wurde, dann ist `__name__` = "__main__". Im Prinzip heißt `if __name__ == '__main__':` `wenn dieses modul das hauptmodul ist:`.

Gruß

Verfasst: Montag 21. September 2009, 22:26
von lunar
"__name__" enthält normalerweise den Namen des aktuellen Moduls. Wird dieses Modul jedoch ausgeführt und nicht importiert (z.B. über "python foo.py"), so setzt der Interpreter "__name__" auf den magischen Wert "__main__".

Dadurch kann man im Modul erkennen, ob das Modul importiert oder ausgeführt wird. So kann man beispielsweise Skripte schreiben, die man auch importieren kann (z.B. für automatisiertes Testing), oder Module, die man ausführen kann (z.B. damit das Modul sich selbst testen).

In der Standardbibliothek sieht man diesen Trick beispielsweise im "webbrowser"-Modul.

Verfasst: Montag 21. September 2009, 22:28
von zenker
Ahso, also kann ich dann mit if...elif... dann steuern, was passieren soll wenn das Programm von einem anderen Programm aufgerufen wird!?!

Verfasst: Montag 21. September 2009, 22:31
von cofi
Nun ``__name__`` ist fuer jedes Modul definiert, fuer den Fall, dass es das Hauptmodul ist, ist der Name eben "__main__", andernfalls ist es der Dateiname des Moduls.

Das Idiom dient einfach dazu, bestimmten Code nur dann auszufuehren, wenn das Modul direkt ausgefuehrt wurde, um die Objekte darin auch fuer andere Module ohne Nebeneffekte nutzbar zu machen.

Verfasst: Montag 21. September 2009, 22:31
von lunar
@zenker: Ja, so ungefähr.