Was bewirkt dies?
if __name__ == "__main__":
print("Hello world!")
Was bewirkt dies?
if __name__ == "__main__":
print("Hello world!")
Um es kurz zu machen, müssen Sie einige Punkte wissen:
import a
Aktion tatsächlich alles ausführt, was in a.py
, d.h. jede Zeile in a.py
Aufgrund von Punkt 1 möchten Sie vielleicht nicht, dass alles in a.py
beim Importieren
Um das Problem in Punkt 2 zu lösen, können Sie in Python eine Bedingungsprüfung verwenden
__name__
ist eine implizite Variable in allen .py
Module:
a.py
est import
der Wert von __name__
von a.py
Modul wird auf seinen Dateinamen " a
"a.py
wird direkt mit " python a.py
", der Wert von __name__
wird auf eine Zeichenkette gesetzt __main__
__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
python a.py
wird den Teil ausführen // do A
import a
überspringt den Teil // do A
__name__ == "a"
je nach funktionalem Bedarf, aber seltenDas 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.
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
).
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.
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.
Bevor Sie etwas über if __name__ == '__main__'
ist es wichtig zu verstehen, was __name__
ist und was es bewirkt.
__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.
Es kann nicht nur in Skripten verwendet werden, sondern ist auch im Interpreter und in Modulen/Paketen zu finden.
>>> print(__name__)
__main__
>>>
test_file.py :
print(__name__)
Daraus ergibt sich __main__
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.
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.
>>> __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.
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__
.
__name__
kann auch in Modulen verwendet werden, um den Namen eines Moduls zu definieren
Es ist auch möglich, andere, weniger gebräuchliche, aber nützliche Dinge zu tun mit __name__
einige werde ich hier zeigen:
if __name__ != '__main__':
# Do some useful things
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 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.
34 Stimmen
Nur fürs Protokoll - was ist " Haupt ": docs.python.org/3/reference/ und was ist " Name ": docs.python.org/3/reference/