PEP 299 – Spezielle __main__() Funktion in Modulen
- Autor:
- Jeff Epler <jepler at unpythonic.net>
- Status:
- Abgelehnt
- Typ:
- Standards Track
- Erstellt:
- 12-Aug-2002
- Python-Version:
- 2.3
- Post-History:
- 29-Mar-2006
Inhaltsverzeichnis
Zusammenfassung
Viele Python-Module sind auch dazu bestimmt, als eigenständige Skripte aufgerufen zu werden. Dieses PEP schlägt vor, dass eine spezielle Funktion namens __main__() diesen Zweck erfüllen soll.
Motivation
Es sollte ein einfaches und universelles Idiom für den Aufruf eines Moduls als eigenständiges Skript geben.
Das semi-übliche Idiom
if __name__ == '__main__':
perform "standalone" functionality
ist für Programmierer von Sprachen wie C und C++ unklar. Es erlaubt auch nicht den Aufruf der eigenständigen Funktion, wenn das Modul importiert wird. Die Variante
if __name__ == '__main__':
main_function()
wird manchmal gesehen, aber es gibt keinen Standardnamen für die Funktion, und da Argumente von sys.argv bezogen werden, ist es nicht möglich, spezifische Argumente zu übergeben, ohne die Argumentliste zu ändern, die alle anderen Module sehen. (Stellen Sie sich ein Multithreaded-Python-Programm vor, bei dem zwei Threads die eigenständige Funktionalität verschiedener Module mit unterschiedlichen Argumentlisten aufrufen möchten)
Vorschlag
Der Standardname der „main-Funktion“ sollte __main__ sein. Wenn ein Modul auf der Befehlszeile aufgerufen wird, z. B.
python mymodule.py
dann verhält sich das Modul so, als ob die folgenden Zeilen am Ende des Moduls stünden (außer dass das Attribut __sys nicht verwendet oder als vorhanden angenommen werden darf)
if globals().has_key("__main__"):
import sys as __sys
__sys.exit(__main__(__sys.argv))
Andere Module können aufrufen
import mymodule mymodule.__main__(['mymodule', ...])
Es liegt an mymodule, Thread-Sicherheitsfragen oder andere Probleme zu dokumentieren, die die Verwendung von __main__ einschränken könnten. (Andere Probleme könnten die Verwendung von sich gegenseitig ausschließenden GUI-Modulen, nicht teilbaren Ressourcen wie Hardware-Geräten, die Neuzuweisung von sys.stdin/stdout usw. umfassen)
Implementierung
In modules/main.c wird der Block in der Nähe von Zeile 385 (nach dem Aufruf von PyRun_AnyFileExFlags) so geändert, dass der obige Code (oder sein C-Äquivalent) ausgeführt wird.
Offene Fragen
- Sollte der Rückgabewert von
__main__als Exit-Wert behandelt werden?Ja. Viele
__main__geben natürlichNonezurück, wassys.exitin einen „erfolgreichen“ Rückgabecode umwandelt. Bei denen, die einen numerischen Wert zurückgeben, verhält es sich genau wie das Argument zusys.exit()oder der Rückgabewert von C’s main(). - Sollte die Argumentliste zu
__main__argv[0]enthalten oder nur die „echten“ Argumenteargv[1:]?argv[0]ist zur Symmetrie mitsys.argvund für die einfache Umstellung auf das neue Standardidiom enthalten.
Ablehnung
In einer kurzen Diskussion auf python-dev [1] wurden zwei größere Kompatibilitätsprobleme angesprochen, und Guido äußerte, dass er die Idee sowieso nicht mag, da sie „die Änderung (in Dokumenten, Benutzergewohnheiten usw.) nicht wert ist und nichts besonders kaputt ist.“
Referenzen
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0299.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT