Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

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ürlich None zurück, was sys.exit in einen „erfolgreichen“ Rückgabecode umwandelt. Bei denen, die einen numerischen Wert zurückgeben, verhält es sich genau wie das Argument zu sys.exit() oder der Rückgabewert von C’s main().

  • Sollte die Argumentliste zu __main__ argv[0] enthalten oder nur die „echten“ Argumente argv[1:]?

    argv[0] ist zur Symmetrie mit sys.argv und 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


Quelle: https://github.com/python/peps/blob/main/peps/pep-0299.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT