Warum def main () verwenden?

Mögliche Duplikate:
Was macht if __name__== "__main__" ?

Ich habe einige Codebeispiele und Anleitungen gesehen, die verwendet werden

 def main(): # my code here if __name__ == "__main__": main() 

Aber warum? Gibt es einen Grund, Ihre functionen nicht am Anfang der Datei zu definieren, sondern nur 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 zum Haupt gibt?

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

Alle anderen haben es bereits beantwortet, aber ich denke, ich habe noch etwas hinzuzufügen.

Gründe dafür, dass die if statement main() aufruft (in keiner bestimmten Reihenfolge):

  • Andere Sprachen (wie C und Java) haben eine main() -function, die aufgerufen wird, wenn das Programm ausgeführt wird. Mit diesem if können wir Python so verhalten, dass sie sich für viele Menschen vertrauter fühlen.

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

  • Es wird möglich sein, diesen Python-Code als ein Modul ohne böse Nebenwirkungen zu import .

    • Dies bedeutet, dass Tests mit diesem 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 diejenigen außerhalb davon global sind . Dies kann zu einigen Fehlern und unerwarteten Verhaltensweisen führen.

Sie müssen jedoch keine main() -function schreiben und sie in einer if statement aufrufen.

Ich selbst schreibe normalerweise kleine Wegwerf-Skripte ohne irgendeine function. Wenn das Skript groß genug wird, oder wenn ich fühle, dass ich den ganzen Code in eine function setze, werde ich davon profitieren, dann refaktoriere ich den Code und tue 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 Variante könnte sein:

 import sys def main(argv): # My code here pass if __name__ == "__main__": main(sys.argv) 

Dies bedeutet, dass Sie main() von anderen Skripten (oder einer interaktiven Shell) aufrufen können, indem Sie benutzerdefinierte Parameter übergeben. Dies kann bei Komponententests oder bei der Stapelverarbeitung nützlich sein. Aber denken Sie daran, dass der obige Code das Parsen von argv erfordert, also wäre es vielleicht besser, einen anderen Aufruf zu verwenden, der bereits analysierte Parameter weiterleitet.

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

 class MyApplication(something): # My code here if __name__ == "__main__": app = MyApplication() app.run() 

Also, schreiben Sie den Code, der Ihnen besser passt. 🙂

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 import foo : import foo

In diesem Fall ist __name__ foo , der Codeabschnitt wird nicht ausgeführt und druckt XXXX .

  • direkt ausgeführt: python foo.py

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

Einer der Verwendung dieser functionalität, um verschiedene Arten von Komponententests innerhalb desselben Moduls zu schreiben.

” Was ist, if __name__==“__main__”: tun? ” if __name__==“__main__”: bereits beantwortet.

Mit einer main() function können Sie ihre functionalität aufrufen, wenn Sie das Modul import . Der Hauptvorteil dieses (IMHO) ist, dass Sie Unit Test testen können.

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