615 Stimmen

Warum def main() verwenden?

Ich habe einige Codebeispiele und Tutorials gesehen, die

def main():
    # my code here

if __name__ == "__main__":
    main()

Aber warum? Gibt es irgendeinen Grund, die Funktionen nicht am Anfang der Datei zu definieren und dann einfach Code darunter zu schreiben?

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 auf die Hauptsache gibt?

3 Stimmen

32 Stimmen

Stackoverflow.com/questions/419163/what-does-if-name-main-do beantwortet nicht die ganze Frage.

13 Stimmen

Was das vermeintliche Duplikat nicht beantwortet: eine main()-Funktion zu haben (anstatt einfach den gesamten Code in die "if nombre "Block) ist nützlich, weil er verhindert, dass versehentlich globale Variablen erstellt werden, die andere Funktionen beeinflussen könnten.

673voto

Ignacio Vazquez-Abrams Punkte 735200

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

267voto

Denilson Sá Maia Punkte 43844

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

Gründe, die dafür sprechen if Anweisungsaufruf main() (in keiner bestimmten Reihenfolge):

  • Andere Sprachen (wie C und Java) haben eine main() Funktion, die bei der Ausführung des Programms aufgerufen wird. Mit dieser if können wir Python dazu bringen, sich wie diese zu verhalten, was sich für viele Menschen vertrauter anfühlt.

  • Der Code wird Reiniger , leichter zu lesen und besser organisiert. (ja, ich weiß, das ist subjektiv)

  • Es wird möglich sein import den Python-Code als Modul ohne unangenehme Nebeneffekte.

  • Dies bedeutet, dass es möglich sein wird, Tests gegen diesen Code durchzuführen.

  • Das bedeutet, dass wir diesen Code in eine interaktive Python-Shell importieren und ihn testen/debuggen/ausführen können.

  • Variablen im Inneren def main son . während diejenigen, die nicht dazu gehören weltweit . Dies kann zu einigen Fehlern und unerwarteten Verhaltensweisen führen.

Aber, Sie sind nicht erforderlich zu schreiben. main() Funktion und rufen sie innerhalb einer if Erklärung.

Ich selbst schreibe in der Regel kleine Wegwerf-Skripte ohne jegliche Funktion. Wenn das Skript groß genug wird oder wenn ich das Gefühl habe, dass es für mich von Vorteil ist, den ganzen Code in eine Funktion zu packen, dann überarbeite ich den Code und tue es. Das passiert auch, wenn ich schreibe bash Skripte.

Auch wenn Sie den Code in die Hauptfunktion einfügen, müssen Sie ihn nicht genau so schreiben. Eine saubere Variante könnte sein:

import sys

def main(argv):
    # My code here
    pass

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

Dies bedeutet, dass Sie Folgendes aufrufen können main() von anderen Skripten (oder der interaktiven Shell), die benutzerdefinierte Parameter übergeben. Dies könnte in Unit-Tests oder bei der Stapelverarbeitung nützlich sein. Denken Sie aber daran, dass der obige Code das Parsen von argv erfordert, daher wäre es vielleicht besser, einen anderen Aufruf zu verwenden, der bereits geparste Parameter übergibt.

In einer objektorientierten Anwendung, die ich geschrieben habe, sah der Code wie folgt aus:

class MyApplication(something):
    # My code here

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

Sie können also den Code schreiben, der Ihnen besser gefällt :)

93voto

pyfunc Punkte 63257

Wenn der Inhalt von foo.py

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

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

  • in eine andere Datei importiert: import foo

In diesem Fall __name__ es foo wird der Codeabschnitt nicht ausgeführt und nicht gedruckt XXXX .

  • direkt ausgeführt: python foo.py

Wenn sie direkt ausgeführt wird, __name__ ist identisch mit __main__ und der Code in diesem Abschnitt wird ausgeführt und gibt XXXX

Diese Funktionalität wird u.a. dazu verwendet, verschiedene Arten von Unit-Tests innerhalb eines Moduls zu schreiben.

23voto

Johnsyweb Punkte 128606

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

Mit einer main() Funktion ermöglicht es Ihnen, seine Funktionalität aufzurufen, wenn Sie import das Modul. Der Hauptvorteil (kein Wortspiel beabsichtigt) besteht darin, dass Sie das Modul testen können.

8voto

Noe Punkte 386

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

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