2010-05-25 9 views
14

Was ist Pythons Äquivalent von "public static void main (String [] args) {...}"? Ich erinnere mich, dass ich es in der Vergangenheit benutzt habe und dann vergessen habe.Pythons Äquivalent von "public static void main"

Was ich im Grunde zu erinnern versuchen, eine Funktion, die ich einige Unterstrichen enthalten denken (__) ...

thx

Antwort

21
#!/usr/bin/env python 

import sys 

def main(args): 
    print args 

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

bearbeiten: emulieren eine void Rückkehr.

+0

JUST schlagen mich dazu :) – Devoted

+2

es ist leicht verwirrend, auch eine Methode mit dem Namen 'main (args)' hier zu haben, da es nichts besonderes daran ist, dass es von der Python-Laufzeit aufgerufen wird. Es ist der Check für '__name __ == '__ main __'' das zählt –

+0

Das ist nicht genau eine 'void' Rückgabe, oder?:) –

10
if __name__ == "__main__": 
    ....do your thing 
0

Oh!

if __name__ == '__main__': 
+0

Nicht ganz. Sie benötigen führende und nachfolgende doppelte Unterstriche, da diese "magische" Namen sind. – Santa

9

Dies ist eine häufig verwendet Idiom, aber es ist nicht gleichbedeutend mit Java public static void main(String args[]). Alle Python-Module werden von oben nach unten ausgeführt alle Anweisungen im Bereich des Moduls. Bei den meisten importierten Modulen sind diese Anweisungen normalerweise auf Klassen- und Methodendefinitionen beschränkt, die Werte im Namespace des Moduls einrichten, aber den Code der Funktionen nicht ausführen. Aber wenn Sie eine Anweisung im Modulbereich wie SPECIAL_CONSTANT = 42 setzen, wird dies sofort ausgeführt, wenn das Modul importiert oder eigenständig ausgeführt wird - keine Notwendigkeit für main() oder __main__ oder irgendetwas. Versuchen Sie, eine print-Anweisung an die Spitze eines einfachen Moduls zu setzen. Unabhängig davon, ob Sie dieses Modul importieren oder es von der Befehlszeile aus ausführen, wird die print-Anweisung immer ausführen.

Was ist schön an diesem Idiom ist, dass es Ihnen ermöglicht, einige einfache Tests oder Demo-Code direkt in eine Bibliothek einzubetten, die in der Regel von einem von Ihrem Kunden geschriebenen Modul importiert wird. Vielleicht so etwas wie folgt aus:

# special_super_duper_module.py 

# this next statements will run, even though not in main() or set off 
# with "__name__ ==" tests or any such thing 
print "You are using special_super_duper_module.py, written by Felix the Cat" 
SPECIAL_CONSTANT = 42 

def super_duper_function1(): 
    pass 

def super_duper_function2(): 
    pass 

if __name__ == "__main__": 
    print "You are running special_super_duper_module.py interactively" 
    assert super_duper_function1() == None, "expected None, got non-None result" 
    assert super_duper_function2() == None, "expected None, got non-None result" 
    # doctests or unittests could also go here, or just a simple demo 

Wenn das Modul von einigen Code importiert wird, die Ihre Super-Duper-Funktionen nutzen möchte, dann ist das kleine Banner oben druckt, aber der Code, der von if __name__ etc....gewonnen conditionalized ist‘ t laufen lassen. Wenn Ihr Benutzer das Modul jedoch direkt mit dem Befehl python ausführt, wird der eingebettete Test- oder Democode ausgeführt.

Im Gegensatz dazu ist public static void main(String args[]) eine spezielle Methodensignatur, die der Java VM mitteilt, mit welcher Methode welcher Klasse zu beginnen ist. Python beginnt einfach am Anfang des benannten Moduls und beginnt von dort aus zu laufen. Deshalb müssen Sie nur schreiben:

print "Hello, World!" 

in einem Modul selbst, um Ihr erstes Python-Programm zu schreiben.

+0

+1 für die umfassende Antwort statt einer oberflächlichen Gadarene-upticker anziehenden Antwort :-) –

+3

@John - lernte ich heute neues Wort. (Ich habe nie einen Gadarene sah, ich hoffe, nie ... etc. etc.) Das, was ich Hass * * über 'public static void main (String [] args)' ist, dass es eine solche rätselhafte Barriere ist, zuerst -Entwickler und ausnahmslos Antworten der Dozenten auf diejenigen, die fragen, "mach dir keine Sorgen darüber, was es bedeutet, gib es einfach ein". Ich halte es für eine Sprache, Konstruktionsfehler, die ein 1. Haupt als Einstiegspunkt muss lernen, 2. öffentliche Methode Schutz, 3. statische Methode Definitionen, 4. Leere eine Funktion ohne Rückkehr, um anzuzeigen, und 5. eine Array-Deklaration, nur um das Programm zu bekommen, um Ihren Namen zu drucken! – PaulMcG

Verwandte Themen