2015-06-15 8 views
5

In linguaggi come C e C++, è comune definire funzioni chiamate sopra i chiamanti, al fine di evitare la necessità di dichiarazioni in avanti. Per esempio:Ordine di funzioni all'interno di un file sorgente Python

void g() { ... } 

void f() { g(); ... } 

int main() { f(); ... } 

In Python, se l'idioma

if __name__ == '__main__': 
    main() 

viene utilizzato alla fine di un file sorgente, le dichiarazioni previsionali sono inutili e l'ordine delle funzioni non importa.

Esiste una convenzione per l'ordine delle funzioni all'interno di un file sorgente Python? Le funzioni chiamate sono ancora generalmente scritte sopra i chiamanti o viceversa?

Modifica: La risposta è che non esiste alcuna convenzione (ad esempio, non c'è nulla in PEP 8) relativa all'ordine delle funzioni. Anche i moduli all'interno della libreria standard sono incoerenti.

+3

L'ordine delle funzioni in python * è * importante. Non puoi chiamare una funzione prima di definirla. In C e C++ dovresti dichiarare la funzione prima di chiamarla, sia nel modo in cui mostri che utilizzando un prototipo. Python non supporta i prototipi. – cdarke

+0

Generalmente sono le classi, quindi le funzioni, quindi il codice "nudo". – Zizouz212

+2

Sto votando per chiudere questa domanda come off-topic perché viene risposto direttamente nella documentazione del prodotto – KevinDTimm

risposta

3

Per i linguaggi tipizzati staticamente, è sufficiente cercare la definizione per determinare il tipo di un oggetto. Tuttavia, se la definizione appare dopo il suo utilizzo, sarebbero necessari due passaggi: 1) determinare i tipi di tali oggetti, 2) compilare usando il tipo allora conosciuto. Se la definizione era in un altro file, dovrebbe essere analizzata anche prima del passaggio 2. Questo è aggirato chiedendo che un oggetto/tipo sia dichiarato (indicare al compilatore che esiste e al suo tipo) prima del suo utilizzo. Questo è sufficiente per compilare. La definizione attuale si limita a riservare spazio per l'oggetto e non è necessario per generare il codice effettivo (principalmente) - questo è ciò che la dichiarazione è per. (Ricorda: molti di questi linguaggi permettono di combinare entrambi, ove appropriato).

In Python, come linguaggio tipizzato in modo dinamico, l'oggetto (valore e il tipo) un nome di riferimento (!) Può cambiare in qualsiasi momento prima del suo effettivo utilizzo da parte del flusso di controllo, quindi è inutile verificarlo prima della sua effettiva utilizzo.

Si consideri il seguente:

def f(): 
    g() 

def g(): 
    pass 

f() 

che potrebbero guardare come se contraddice la "definire la prima" la politica. Ma in realtà non è così, come g() sarà richiesto solo quando f() è effettivamente in esecuzione. Questo non è prima che venga eseguita l'ultima riga (f()), in cui il punto g() è stato ottimamente definito definito.

+6

Un vigliacco è uno che downvotes, ma non lascia un commento. – Olaf

+1

Non è un downvoter, ma immagino che alcuni abbiano fatto perché il tuo post non ha affrontato la questione della convention. Per quanto mi riguarda, mi piace organizzare le definizioni delle funzioni come si farebbe in C, perché nella mia esperienza questo rende più facile la navigazione del codice. – MarkM

+1

@MarkM Rispondo molto bene alla domanda. OP chiede una convenzione e (indirettamente) perché funzioni ancora senza definizione prima dell'uso. Mi rivolgo ad entrambi, poiché non esiste una convenzione e spiego perché non c'è bisogno (o cosa differisce). Se usi il modo C (Pascal, ecc.) (Così faccio io), questo è un parere, nessuna convenzione generale e non accettabile per l'overflow dello stack (leggi [chiedi] .Quindi mi concentro sullo sfondo, non sulle opinioni – Olaf

Problemi correlati