it-swarm.com.de

Warum def main () verwenden?

Mögliches Duplikat:
Was macht if __name__== "__main__"?

Ich habe einige Codebeispiele und Tutorials gesehen, die verwendet werden

def main():
    # my code here

if __== "__main__":
    main()

Aber wieso? Gibt es einen Grund, Ihre Funktionen nicht oben in der Datei zu definieren, sondern einfach Code darunter zu schreiben? dh

def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

Ich frage mich nur, ob es einen Reim für die Hauptleitung gibt.

536
Wizzard

Ohne den Haupt-Sentinel würde der Code auch dann ausgeführt, wenn das Skript als Modul importiert würde.

603

Alle anderen haben bereits geantwortet, aber ich glaube, ich habe noch etwas hinzuzufügen.

Gründe dafür, dass die Anweisung ifmain() aufruft (in keiner bestimmten Reihenfolge):

  • Andere Sprachen (wie C und Java) haben eine main() -Funktion, die beim Ausführen des Programms aufgerufen wird. Mit diesem if können wir Python dazu bringen, sich wie sie zu verhalten, was für viele Menschen vertrauter ist.

  • Code wird sauberer , besser lesbar und übersichtlicher. (Ja, ich weiß, das ist subjektiv)

  • Es wird möglich sein, import diesen python Code als Modul ohne böse Nebenwirkungen zu verwenden.

    • Dies bedeutet, dass Tests für diesen Code ausgeführt werden können.

    • Dies bedeutet, dass wir diesen Code in eine interaktive python Shell importieren und testen/debuggen/ausführen können.

  • Variablen innerhalb von def main sind lokal, während die außerhalb global sind. Dies kann zu einigen Fehlern und unerwartetem Verhalten führen.

Aber Sie sind nicht erforderlich, um eine main() -Funktion zu schreiben und sie in einer if -Anweisung aufzurufen.

Ich selbst beginne normalerweise damit, kleine Wegwerfskripte ohne irgendeine Funktion zu schreiben. Wenn das Skript groß genug wird oder ich das Gefühl habe, dass das Einfügen des gesamten Codes in eine Funktion für mich von Vorteil ist, überarbeite ich den Code und mache es. Dies passiert auch, wenn ich bash Skripte schreibe.

Selbst wenn Sie Code in die Hauptfunktion einfügen, müssen Sie ihn nicht genau so schreiben. Eine nette Abwechslung könnte sein:

import sys

def main(argv):
    # My code here
    pass

if __== "__main__":
    main(sys.argv)

Dies bedeutet, dass Sie main() von anderen Skripten (oder von der interaktiven Shell) aus aufrufen können, indem Sie benutzerdefinierte Parameter übergeben. Dies kann bei Komponententests oder bei der Stapelverarbeitung hilfreich sein. Denken Sie jedoch daran, dass der obige Code das Parsen von argv erfordert. Daher ist es möglicherweise besser, einen anderen Aufruf zu verwenden, der bereits geparste Parameter übergibt.

In einer objektorientierten Anwendung, die ich geschrieben habe, sah der Code folgendermaßen aus:

class MyApplication(something):
    # My code here

if __== "__main__":
    app = MyApplication()
    app.run()

Schreiben Sie einfach den Code, der besser zu Ihnen passt. :)

235

wenn der Inhalt von foo.py

print __name__
if __== '__main__':
    print 'XXXX'

Eine Datei foo.py kann auf zwei Arten verwendet werden.

  • in eine andere Datei importiert: import foo

In diesem Fall ist __name__foo, der Codeabschnitt wird nicht ausgeführt und gibt XXXX nicht aus.

  • direkt ausgeführt: python foo.py

Wenn es direkt ausgeführt wird, ist __name__ dasselbe wie __main__ und der Code in diesem Abschnitt wird ausgeführt und gibt XXXX aus.

Eine der Anwendungen dieser Funktionalität, um verschiedene Arten von Komponententests innerhalb desselben Moduls zu schreiben.

90
pyfunc

" Was macht if __name__==“__main__”:? " wurde bereits beantwortet.

Mit der Funktion main() können Sie die Funktionalität aufrufen, wenn Sie import das Modul verwenden. Der Hauptvorteil (kein Wortspiel beabsichtigt) von diesem (IMHO) ist, dass Sie es Unit-Test können.

20
Johnsyweb

Betrachten Sie das zweite Skript. Wenn Sie es in ein anderes importieren, werden die Anweisungen auf "globaler Ebene" ausgeführt.

8
Noe