2010-05-25 21 views
14

Qual è l'equivalente di Python di "public static void main (String [] args) {...}"? Ricordo di averlo usato in passato e poi ho dimenticato.Equivalente di Python di "public static void main"

Quello che sto cercando di ricordare in sostanza è una funzione che credo incluso alcune sottolineature (__) ...

thx

risposta

21
#!/usr/bin/env python 

import sys 

def main(args): 
    print args 

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

modificare: emulare un ritorno void.

+0

JUST mi ha battuto su di esso :) – Devoted

+2

è un po 'confuso avere anche un metodo chiamato 'main (args)' qui, poiché non c'è niente di speciale che lo faccia invocare dal runtime python. È il controllo per '__name __ == '__ principale __'' che conta –

+0

Questo non è esattamente un ritorno 'void', vero?:) –

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

Oh!

if __name__ == '__main__': 
+0

Non proprio. Hai bisogno di caratteri di sottolineatura in testa e in coda, poiché si tratta di nomi "magici". – Santa

9

Questo è un comunemente -uso idioma, ma NON è equivalente a Java public static void main(String args[]). Tutti i moduli Python eseguono dall'alto verso il basso tutte le istruzioni nell'ambito del modulo. Per la maggior parte dei moduli importati, queste istruzioni sono generalmente limitate alle definizioni di classi e metodi, che impostano valori nello spazio dei nomi del modulo, ma in realtà non eseguono il codice delle funzioni. Ma se inserisci un'istruzione nello scope del modulo come SPECIAL_CONSTANT = 42, questa verrà eseguita immediatamente quando il modulo viene importato o eseguito autonomamente, senza necessità di main() o __main__ o altro. Prova a inserire un'istruzione print nella parte superiore di un modulo semplice. Sia che si importi quel modulo sia che lo si esegua da solo dalla riga di comando, l'istruzione print eseguirà sempre.

Ciò che è bello di questo idioma è che consente di incorporare alcuni semplici test o codice demo direttamente in una libreria che viene in genere importata da qualche modulo scritto dal cliente. Forse qualcosa di simile:

# 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 

Quando il modulo viene importato da qualche codice che vuole utilizzare le funzioni Super Duper, poi il piccolo banner in alto stamperà, ma il codice che viene conditionalized da if __name__ etc....vinto' t get run. Ma se il tuo utente esegue il modulo direttamente usando il comando python, allora il test incorporato o il codice demo eseguirà.

Al contrario, public static void main(String args[]) è una firma di metodo speciale che indica alla VM Java quale metodo di quale classe iniziare. Python inizia appena nella parte superiore del modulo chiamato e inizia a correre da lì. Ecco perché è sufficiente scrivere:

print "Hello, World!" 

in un modulo tutto da solo per scrivere il tuo primo programma Python.

+0

+1 per la risposta esaustiva al posto di una superficiale risposta all'aumento di Gadarene-attirare :-) –

+3

@John - Ho imparato una nuova parola oggi. (Non ho mai visto un Gadarene, non ho mai sperato ..., ecc. Ecc.) La cosa che * odio * circa 'public static void main (String [] args)' è che è una barriera così enigmatica prima -time gli sviluppatori, e invariabilmente, le risposte degli istruttori a coloro che chiedono sono "non preoccuparti di cosa significa, basta scriverlo". Lo considero un difetto di progettazione linguistica che bisogna imparare 1. main come punto di ingresso, 2. protezione del metodo pubblico, 3. definizioni dei metodi statici, 4. void per indicare una funzione senza ritorno e 5. una dichiarazione di array, solo per ottenere il programma per stampare il tuo nome! – PaulMcG

Problemi correlati