2010-09-15 8 views
9

Ho letto su quando utilizzare assert vs exceptions, ma non riesco ancora a "ottenerlo". Sembra che ogni volta che penso di trovarmi in una situazione in cui dovrei usare asserire, più avanti nello sviluppo trovo che sto "guardando prima di saltare" per assicurarmi che l'assert non abbia esito negativo quando chiamo la funzione. Dato che c'è un altro idioma Python su come preferire usare try-except, in genere finisco per abbandonare l'assert e lanciare un'eccezione. Devo ancora trovare un posto dove sembra giusto usare un'affermazione. Qualcuno può venire con alcuni buoni esempi?Esempio di utilizzo di asserzione in Python?

risposta

20

Una buona indicazione utilizza assert quando la sua attivazione si intende un insetto nel codice. Quando il tuo codice presuppone qualcosa e agisce sul presupposto, si consiglia di proteggere questa ipotesi con un assert. Questo errore assert significa che la tua ipotesi non è corretta, il che significa che il tuo codice non è corretto.

3

Generalmente, si asserisce che è possibile verificare un'ipotesi sul proprio codice, ad esempio in quel momento, l'asserzione ha esito positivo oppure l'implementazione è in qualche modo difettosa. Un'eccezione sta aspettando acutalmente che si verifichi un errore e lo "abbracci", permettendoti di gestirlo.

3

Un buon esempio sta verificando gli argomenti di una funzione di coerenza:

def f(probability_vector, positive_number): 
    assert sum(probability_vector) == 1., "probability vectors have to sum to 1" 
    assert positive_number >= 0., "positive_number should be positive" 
    # body of function goes here 
+1

Interessante - Non sapevo che "0" era una scorciatoia per '0.0'. repl dice che è però. Potrei non usarlo nel codice reale anche se sembra eccessivamente "intelligente" e facilmente mancato. Potrebbe essere inteso come un errore di battitura, ma 0.0 è sempre inteso come un galleggiante. – Daenyth

+0

Sembra simile a una situazione in cui avevo una funzione che stava recuperando un elemento da una matrice 2D. Aveva senso affermare che gli input di riga e colonna erano effettivamente nei limiti della matrice. Ma più tardi stavo facendo qualcosa in cui prendevo un elemento e volevo fare qualcosa con elementi adiacenti. Una volta iniziato a codificarlo, dovevo avere casi speciali quando l'elemento era sul bordo, perché gli elementi adiacenti erano fuori dalla matrice. Invece è stato meglio usare solo le eccezioni. – Colin

+0

In che modo le eccezioni rendono più semplice la modifica del codice? Quando cambi il comportamento della funzione, devi ancora modificare la parte che genera l'eccezione, vero? – pberkes

15

tendono ad utilizzare asserire per verificare che non si verifichi mai. un po 'come un controllo mentale.

Un'altra cosa da capire è che asserts vengono rimossi quando ottimizzato:

Il generatore di codice attuale non emette codice per un'istruzione di asserzione quando l'ottimizzazione è richiesto al momento della compilazione.

+4

+1 per indicare che le asserzioni vengono rimosse se invochi Python con il flag '-O'.Il punto è che se tu * ti aspetti che il tuo codice si comporti in modo diverso se prendi le affermazioni, allora stai abusando di esse - sono solo per il debug. –

Problemi correlati