Was bewirkt dies?
if __name__ == "__main__":
print("Hello world!")
Was bewirkt dies?
if __name__ == "__main__":
print("Hello world!")
Es handelt sich um eine spezielle Funktion, wenn eine Python-Datei von der Kommandozeile aus aufgerufen wird. Dies wird typischerweise verwendet, um eine "main()"-Funktion aufzurufen oder anderen geeigneten Startcode auszuführen, wie z. B. die Behandlung von Kommandozeilenargumenten.
Er könnte auf verschiedene Weise geschrieben werden. Eine andere ist:
def some_function_for_instance_main():
dosomething()
__name__ == '__main__' and some_function_for_instance_main()
Ich sage nicht, dass Sie dies in Produktionscode verwenden sollten, aber es dient zur Veranschaulichung, dass es nichts "Magisches" an if __name__ == '__main__'
.
Es ist nur eine Konvention für den Aufruf einer Hauptfunktion in Python-Dateien.
Ich würde dies als schlechte Form betrachten, da Sie sich 1) auf die Nebenwirkungen verlassen und 2) missbräuchlich and
. and
wird verwendet, um zu prüfen, ob zwei boolesche Aussagen beide wahr sind. Da Sie nicht an dem Ergebnis der and
an if
Aussage Ihre Absichten deutlicher zum Ausdruck bringt.
Abgesehen von der Frage, ob das Ausnutzen des Kurzschlussverhaltens von booleschen Operatoren als Flusskontrollmechanismus ein schlechter Stil ist oder nicht, besteht das größere Problem darin, dass diese beantwortet die Frage überhaupt nicht .
@jpmc26 Jeder, der sich mit Perl oder Javascript auskennt, kommt mit diesem Idiom gut zurecht, indem er and
als Kontrollanweisung. Ich habe keine Probleme damit. Ein anderes ähnliches Idiom ist die Verwendung von or
um Standardwerte einzustellen. Zum Beispiel, x = input("what is your name? ") or "Nameless Person"
.
Ich denke, es ist am besten, die Antwort ausführlich und in einfachen Worten zu formulieren:
__name__
: Jedes Modul in Python hat ein spezielles Attribut namens __name__
. Es handelt sich um eine eingebaute Variable, die den Namen des Moduls zurückgibt.
__main__
: Wie andere Programmiersprachen hat auch Python einen Einstiegspunkt für die Ausführung, nämlich main. '__main__'
ist der Name des Bereichs, in dem der Code der obersten Ebene ausgeführt wird . Grundsätzlich haben Sie zwei Möglichkeiten, ein Python-Modul zu verwenden: Sie können es direkt als Skript ausführen oder es importieren. Wenn ein Modul als Skript ausgeführt wird, wird sein __name__
wird eingestellt auf __main__
.
Daher ist der Wert der __name__
Attribut wird gesetzt auf __main__
wenn das Modul als Hauptprogramm ausgeführt wird. Andernfalls wird der Wert von __name__
den Namen des Moduls enthalten soll.
Es gibt eine Reihe von Variablen, die das System (Python-Interpreter) für Quelldateien (Module) bereitstellt. Sie können deren Werte jederzeit abrufen, daher wollen wir uns auf die __name__ Variable/Attribut:
Wenn Python eine Quellcodedatei lädt, führt es den gesamten darin befindlichen Code aus. (Beachten Sie, dass es nicht alle Methoden und Funktionen aufruft, die in der Datei definiert sind, aber es definiert sie).
Bevor der Interpreter jedoch die Quellcodedatei ausführt, definiert er einige spezielle Variablen für diese Datei; __name__ ist eine dieser speziellen Variablen, die Python automatisch für jede Quellcodedatei definiert.
Wenn Python diese Quellcodedatei als Hauptprogramm lädt (d.h. die Datei, die Sie ausführen), dann setzt es die spezielle __name__ Variable für diese Datei einen Wert haben "__main__" .
Wenn dies aus einem anderen Modul importiert wird, __name__ wird auf den Namen des Moduls gesetzt.
Also, in Ihrem Beispiel zum Teil:
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
bedeutet, dass der Codeblock:
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
wird nur ausgeführt, wenn Sie das Modul direkt ausführen; der Codeblock wird nicht ausgeführt, wenn ein anderes Modul ihn aufruft/importiert, da der Wert von __name__ wird nicht gleich " Haupt " in diesem speziellen Fall.
Ich hoffe, das hilft Ihnen weiter.
Hallo, Sie sind einer der wenigen, die die Frage nach dem Multithreading-Aspekt beantwortet haben. Darf ich Sie fragen, was passiert, wenn ich Code außerhalb von "main" und nicht innerhalb einer Funktion gekapselt habe? Wird dieser Code von jedem neuen Thread, der von "main" aus gestartet wird, wieder und wieder ausgeführt?
if __name__ == "__main__":
ist im Grunde die oberste Skriptumgebung und gibt dem Interpreter vor, dass ("Ich habe die höchste Priorität und werde zuerst ausgeführt").
'__main__'
ist der Name des Bereichs, in dem der Code der obersten Ebene ausgeführt wird. Der Bereich eines Moduls __name__
gleichgesetzt wird mit '__main__'
wenn sie von der Standardeingabe, einem Skript oder von einer interaktiven Eingabeaufforderung gelesen wird.
if __name__ == "__main__":
# Execute only if run as a script
main()
Bedenken Sie:
print __name__
Die Ausgabe für das obige Beispiel lautet __main__
.
if __name__ == "__main__":
print "direct method"
Die obige Aussage ist wahr und druckt "direkte Methode" . Angenommen, diese Klasse wird in eine andere Klasse importiert, dann wird sie nicht gedruckt. "direkte Methode" weil es beim Importieren die __name__ equal to "first model name"
.
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/