Bevor Sie etwas darüber erklären, if __name__ == '__main__'
ist es wichtig zu verstehen, was __name__
ist und was es tut.
Was ist __name__
?
__name__
ist ein DunderAlias - kann als globale Variable betrachtet werden (über Module zugänglich) und funktioniert ähnlich wie global
.
Es ist eine Zeichenfolge (global wie oben erwähnt), wie durch type(__name__)
(Nachgeben <class 'str'>
) angegeben, und ein integrierter Standard für Python 3- und Python 2- Versionen.
Wo:
Es kann nicht nur in Skripten verwendet werden, sondern ist auch sowohl im Interpreter als auch in Modulen / Paketen enthalten.
Dolmetscher:
>>> print(__name__)
__main__
>>>
Skript:
test_file.py :
print(__name__)
Ergebend __main__
Modul oder Paket:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
Ergebend somefile
Beachten Sie, dass bei Verwendung in einem Paket oder Modul __name__
der Name der Datei verwendet wird. Der Pfad des eigentlichen Modul- oder Paketpfads wird nicht angegeben, verfügt jedoch über eigene DunderAlias __file__
, die dies ermöglichen.
Sie sollten sehen, dass, wo __name__
, wo es sich um die Hauptdatei (oder das Hauptprogramm) handelt, immer zurückgegeben __main__
wird und wenn es sich um ein Modul / Paket oder etwas handelt, das von einem anderen Python-Skript ausgeführt wird, der Name der Datei zurückgegeben wird, in der es sich befindet stammt aus.
Trainieren:
Eine Variable sein bedeutet, dass es den Wert kann überschrieben werden ( „kann“ bedeutet nicht „sollte“), um den Wert des Überschreiben __name__
in einem Mangel an Lesbarkeit führt. Also tu es aus irgendeinem Grund nicht. Wenn Sie eine Variable benötigen, definieren Sie eine neue Variable.
Es wird immer davon ausgegangen , dass der Wert __name__
sein , __main__
oder den Namen der Datei. Das erneute Ändern dieses Standardwerts führt zu mehr Verwirrung darüber, dass er gut tut, und führt später zu Problemen.
Beispiel:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
Es wird allgemein als bewährte Methode angesehen, die if __name__ == '__main__'
Skripte einzubeziehen.
Nun zur Antwort if __name__ == '__main__'
:
Jetzt wissen wir, dass das Verhalten der __name__
Dinge klarer wird:
An if
ist eine Flusssteuerungsanweisung, die den Codeblock enthält, der ausgeführt wird, wenn der angegebene Wert wahr ist. Wir haben gesehen, dass __name__
entweder
__main__
oder der Dateiname, aus dem es importiert wurde, verwendet werden kann.
Dies bedeutet, dass wenn __name__
gleich, __main__
dann muss die Datei die Hauptdatei sein und tatsächlich ausgeführt werden (oder es ist der Interpreter), nicht ein Modul oder Paket, das in das Skript importiert wird.
Wenn tatsächlich __name__
der Wert von angenommen wird, __main__
wird alles ausgeführt, was sich in diesem Codeblock befindet.
Dies sagt uns, dass diese Bedingung ausgeführt werden muss, wenn die ausgeführte Datei die Hauptdatei ist (oder wenn Sie direkt vom Interpreter ausgeführt werden). Wenn es sich um ein Paket handelt, sollte dies nicht der Fall sein, und der Wert wird nicht angegeben __main__
.
Module:
__name__
kann auch in Modulen verwendet werden, um den Namen eines Moduls zu definieren
Varianten:
Es ist auch möglich, andere, weniger verbreitete, aber nützliche Dinge zu tun __name__
, von denen ich einige hier zeigen werde:
Wird nur ausgeführt, 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 dies nicht der Fall ist:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
Sie können es auch verwenden, um ausführbare Hilfefunktionen / Dienstprogramme für Pakete und Module bereitzustellen, ohne dass Bibliotheken aufwändig verwendet werden müssen.
Außerdem können Module über die Befehlszeile als Hauptskripte ausgeführt werden, was ebenfalls sehr nützlich sein kann.
if __name__ == "__main__":
die Blockbedingung bis Python 3 veraltet / veraltet? Ich habe einige Informationen darüber gefunden.