7951 Stimmen

Was passiert, wenn __name__ == "__main__":?

Was bewirkt dies?

if __name__ == "__main__":
    print("Hello world!")

34 Stimmen

Nur fürs Protokoll - was ist " Haupt ": docs.python.org/3/reference/ und was ist " Name ": docs.python.org/3/reference/

59voto

jack Punkte 1351

Um es kurz zu machen, müssen Sie einige Punkte wissen:

  1. import a Aktion tatsächlich alles ausführt, was in a.py , d.h. jede Zeile in a.py

  2. Aufgrund von Punkt 1 möchten Sie vielleicht nicht, dass alles in a.py beim Importieren

  3. Um das Problem in Punkt 2 zu lösen, können Sie in Python eine Bedingungsprüfung verwenden

  4. __name__ ist eine implizite Variable in allen .py Module:

  • wenn a.py est import der Wert von __name__ von a.py Modul wird auf seinen Dateinamen " a "
  • wenn a.py wird direkt mit " python a.py ", der Wert von __name__ wird auf eine Zeichenkette gesetzt __main__
  1. Basierend auf dem Mechanismus, wie Python die Variable __name__ wissen Sie, wie Sie Punkt 3 für jedes Modul erreichen können? Die Antwort ist ziemlich einfach, oder? Verwenden Sie eine wenn Zustand: if __name__ == "__main__": // do A
  • dann python a.py wird den Teil ausführen // do A
  • und import a überspringt den Teil // do A
  1. Sie können sogar angeben, ob __name__ == "a" je nach funktionalem Bedarf, aber selten

Das Wichtigste, was Python auszeichnet, ist Punkt 4! Der Rest ist nur grundlegende Logik.

Ich habe so viel in den Antworten auf dieser Seite gelesen. Ich würde sagen, wenn du die Sache kennst, wirst du diese Antworten sicher verstehen, ansonsten bist du immer noch verwirrt.

5 Stimmen

Ja, Punkt 1 ist unbedingt zu verstehen. Damit wird die Notwendigkeit dieses Mechanismus deutlich.

58voto

Alisa Punkte 2604

Betrachten wir die Antwort auf eine abstraktere Weise:

Angenommen, wir haben diesen Code in x.py :

...
<Block A>
if __name__ == '__main__':
    <Block B>
...

Die Blöcke A und B werden ausgeführt, wenn wir die x.py .

Aber nur Block A (und nicht B) wird ausgeführt, wenn wir ein anderes Modul laufen lassen, y.py zum Beispiel, bei dem x.py importiert wird und der Code von dort aus ausgeführt wird (wie bei einer Funktion in x.py wird aufgerufen von y.py ).

47voto

Zain Punkte 1176

Wenn Sie Python interaktiv ausführen, wird die lokale __name__ wird der Variable ein Wert von __main__ . Wenn Sie ein Python-Modul von der Kommandozeile aus ausführen, anstatt es in ein anderes Modul zu importieren, wird sein __name__ wird der Wert des Attributs __main__ und nicht den eigentlichen Namen des Moduls. Auf diese Weise können die Module ihre eigenen __name__ Wert, um selbst zu bestimmen, wie sie verwendet werden, ob als Unterstützung für ein anderes Programm oder als Hauptanwendung, die von der Befehlszeile aus ausgeführt wird. Daher ist die folgende Redewendung in Python-Modulen durchaus üblich:

if __name__ == '__main__':
    # Do something appropriate here, like calling a
    # main() function defined elsewhere in this module.
    main()
else:
    # Do nothing. This module has been imported by another
    # module that wants to make use of the functions,
    # classes and other useful bits it has defined.

45voto

Larry Punkte 1202

Bedenken Sie:

if __name__ == "__main__":
    main()

Sie prüft, ob die __name__ Attribut des Python-Skripts lautet "__main__" . Mit anderen Worten: Wenn das Programm selbst ausgeführt wird, wird das Attribut __main__ , so dass das Programm ausgeführt wird (in diesem Fall die main() Funktion).

Wenn Ihr Python-Skript jedoch von einem Modul verwendet wird, muss jeder Code außerhalb der if Anweisung ausgeführt werden, also if \__name__ == "\__main__" wird nur verwendet, um zu prüfen, ob das Programm als Modul verwendet wird oder nicht, und entscheidet daher, ob der Code ausgeführt werden soll.

43voto

Xantium Punkte 10070

Bevor Sie etwas über if __name__ == '__main__' ist es wichtig zu verstehen, was __name__ ist und was es bewirkt.

Was ist __name__ ?

__name__ ist eine DunderAlias - kann als globale Variable betrachtet werden (auf die von Modulen aus zugegriffen werden kann) und funktioniert ähnlich wie global .

Es handelt sich um eine Zeichenkette (global wie oben erwähnt), die durch type(__name__) (mit dem Ergebnis <class 'str'> ), und ist ein eingebauter Standard sowohl für Python 3 et Python 2 Versionen.

Wo

Es kann nicht nur in Skripten verwendet werden, sondern ist auch im Interpreter und in Modulen/Paketen zu finden.

Dolmetscher:

>>> print(__name__)
__main__
>>>

Drehbuch:

test_file.py :

print(__name__)

Daraus ergibt sich __main__

Modul oder Paket:

somefile.py:

def somefunction():
    print(__name__)

test_file.py:

import somefile
somefile.somefunction()

Daraus ergibt sich somefile

Beachten Sie, dass bei Verwendung in einem Paket oder Modul, __name__ übernimmt den Namen der Datei. Der Pfad des eigentlichen Moduls oder Paketpfads wird nicht angegeben, sondern hat seinen eigenen DunderAlias __file__ die dies ermöglicht.

Sie sollten sehen, dass dort, wo __name__ wo es die Hauptdatei (oder das Programm) ist, wird immer return __main__ und gibt, wenn es sich um ein Modul/Paket oder etwas handelt, das von einem anderen Python-Skript ausgeht, den Namen der Datei zurück, aus der es stammt.

Praxis

Eine Variable zu sein bedeutet, dass ihr Wert kann überschrieben werden ("kann" bedeutet nicht "sollte"), das Überschreiben des Wertes von __name__ führt zu einem Mangel an Lesbarkeit. Tun Sie es also nicht, aus welchem Grund auch immer. Wenn Sie eine Variable benötigen, definieren Sie eine neue Variable.

Es wird immer davon ausgegangen, dass der Wert von __name__ zu sein __main__ oder den Namen der Datei. Auch hier gilt, dass eine Änderung dieses Standardwerts mehr Verwirrung stiftet als nützt und spätere Probleme verursacht.

Beispiel:

>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>

Im Allgemeinen gilt es als gute Praxis, die if __name__ == '__main__' in Skripten.

Nun zur Antwort if __name__ == '__main__' :

Wir kennen jetzt das Verhalten von __name__ werden die Dinge klarer:

Eine if ist eine Flusssteuerungsanweisung, die den Codeblock enthält, der ausgeführt wird, wenn der angegebene Wert wahr ist. Wir haben gesehen, dass __name__ können entweder __main__ oder den Namen der Datei, aus der es importiert wurde.

Dies bedeutet, dass, wenn __name__ ist gleich __main__ dann muss die Datei die Hauptdatei sein und muss tatsächlich laufen (oder es ist der Interpreter), nicht ein in das Skript importiertes Modul oder Paket.

Wenn tatsächlich __name__ nimmt den Wert von __main__ dann wird alles, was in diesem Codeblock steht, ausgeführt.

Das bedeutet, dass die Bedingung ausgeführt werden muss, wenn es sich bei der Datei, die ausgeführt wird, um die Hauptdatei handelt (oder Sie sie direkt vom Interpreter aus ausführen). Wenn es sich um ein Paket handelt, sollte sie nicht ausgeführt werden, und der Wert ist dann nicht __main__ .

Module

__name__ kann auch in Modulen verwendet werden, um den Namen eines Moduls zu definieren

Varianten

Es ist auch möglich, andere, weniger gebräuchliche, aber nützliche Dinge zu tun mit __name__ einige werde ich hier zeigen:

Ausführung nur, wenn die Datei ein Modul oder Paket ist

if __name__ != '__main__':
    # Do some useful things 

Ausführen einer Bedingung, wenn die Datei die Hauptdatei ist, und einer anderen, wenn sie es nicht ist

if __name__ == '__main__':
    # Execute something
else:
    # Do some useful things

Sie können es auch verwenden, um lauffähige Hilfsfunktionen für Pakete und Module bereitzustellen, ohne aufwendige Bibliotheken verwenden zu müssen.

Es ermöglicht auch die Ausführung von Modulen von der Kommandozeile aus als Hauptskripte, was ebenfalls sehr nützlich sein kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X