Dichiara la funzione alla fine del file in Python


94

È possibile chiamare una funzione senza prima definirla completamente? Quando ci provo, ricevo l'errore: " nome_funzione non è definito". Vengo da uno sfondo C ++, quindi questo problema mi lascia perplesso.

Dichiarare la funzione prima dei lavori:

def Kerma():
        return "energy / mass"    

print Kerma()

Tuttavia, il tentativo di chiamare la funzione senza prima definirla dà problemi:

print Kerma()

def Kerma():
    return "energy / mass"

In C ++, puoi dichiarare una funzione dopo la chiamata dopo aver posizionato la sua intestazione prima di essa.

Mi manca qualcosa qui?


5
In Python non c'è "declare". C'è la definizione (che deve essere completa) o non c'è niente.
S.Lott

2
Dici: "dà problemi". Puoi approfondire questo?
Martin Del Vecchio

Possibile duplicato delle funzioni
utente

Nel caso in cui qualcuno si chiede:Kerma is an acronym for "kinetic energy released per unit mass"
anon

1
So che è molto vecchio, ma perché nessuno ha raccomandato di mettere le funzioni in un .pyfile separato e di importarlo? Ci sono conseguenze indesiderate?
Kyle

Risposte:


145

Un modo che è un po 'idiomatico in Python è scrivere:

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

Questo ti permette di scrivere il codice nell'ordine che preferisci finché continui a chiamare la funzione mainalla fine.


4
@ Muhammad: sebbene questo sia un approccio praticabile, sicuramente non è idiomatico in Python. Al contrario, noterai che la maggior parte delle mainfunzioni sono solitamente posizionate alla fine.
Eli Bendersky

15
@ Eli Bendersky: direi che l' if __name__ == '__main__':interruttore è la parte idiomatica comune.
S.Lott

2
@Eli: la parte idiomatica è la clausola if alla fine: nessun codice al livello superiore del modulo, quindi alla fine invoca una funzione main se il modulo è main .
Ned Batchelder

1
@Eli: La parte idiomatica è il file if ... __main__':. Non ho detto che maindovrebbe essere posizionato sopra il resto del codice. Ho detto che la parte importante è la chiamata _\_main__alla fine, e non importa dove collochi la sua definizione.
Muhammad Alkarouri

2
Con lo switch if name == ' main ': diventa irrilevante il modo in cui ordinate le vostre funzioni. Questa è la cosa giusta (TM) da fare.
MKesper

18

Quando viene eseguito un modulo Python (file .py), le istruzioni di primo livello in esso vengono eseguite nell'ordine in cui appaiono, dall'alto verso il basso (dall'inizio alla fine). Ciò significa che non puoi fare riferimento a qualcosa finché non lo hai definito. Ad esempio, quanto segue genererà l'errore mostrato:

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17

A differenza di molti altri linguaggi, defe le classistruzioni sono eseguibili in Python, non solo dichiarative, quindi non è possibile fare riferimento a nessuno dei due ao bfino a quando ciò non accade e sono definiti. Questo è il motivo per cui il tuo primo esempio ha problemi: stai facendo riferimento alla Kerma()funzione prima che la sua defistruzione sia stata eseguita e il corpo sia stato elaborato e l'oggetto funzione risultante associato al nome della funzione, quindi non è definito in quel punto nello script.

I programmi in linguaggi come il C ++ vengono solitamente preelaborati prima di essere eseguiti e durante questa fase di compilazione l'intero programma e tutti i #includefile a cui fa riferimento vengono letti ed elaborati tutti in una volta. A differenza di Python, questo linguaggio presenta istruzioni dichiarative che consentono di dichiarare (ma non definire) il nome e la sequenza di chiamata delle funzioni (o il tipo statico di variabili), in modo che quando il compilatore incontra il loro nome abbia abbastanza informazioni per controllare il loro utilizzo, che comporta principalmente il controllo del tipo e le conversioni del tipo, nessuno dei quali richiede che il loro contenuto effettivo o il corpo del codice siano stati ancora definiti.


Non è che un linguaggio dinamico non possa farlo. Perl è un linguaggio dinamico e puoi chiamare una funzione prima di definirla. Questo perché ha una fase di compilazione e una fase di esecuzione (sebbene stranamente, ma utilmente, puoi organizzare l'esecuzione del codice durante la fase di compilazione). Funziona: doit(); sub doit { print("I'm doing it!\n"); }
John Deighan

9

Questo non è possibile in Python, ma francamente scoprirai presto che non ne hai affatto bisogno. Il modo pitonico di scrivere codice è dividere il programma in moduli che definiscono classi e funzioni e un singolo "modulo principale" che importa tutti gli altri e viene eseguito.

Per semplici script usa e getta abituati a posizionare la "porzione eseguibile" alla fine, o meglio ancora, impara a usare una shell Python interattiva.


1

Python è un linguaggio dinamico e l'interprete prende sempre lo stato delle variabili (funzioni, ...) così come sono al momento di chiamarle. Potresti anche ridefinire le funzioni in alcuni blocchi if e chiamarle ogni volta in modo diverso. Ecco perché devi definirli prima di chiamarli.


1

Se vuoi essere come C ++ e usare tutto all'interno di un file functions. puoi chiamare la prima funzione dalla parte inferiore del file, in questo modo:

def main():
    print("I'm in main")
    #calling a although it is in the bottom
    a()

def b():
   print("I'm in b")

def a():
   print("I'm in a")
   b()

main()

In questo modo Python prima "legge" l'intero file e poi avvia l'esecuzione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.