2012-04-24 12 views
14

seguito "principio di Samurai", che sto cercando di fare questo sulle mie funzioni, ma sembra che sia sbagliato ...istruzione raise su un'espressione condizionale

return <value> if <bool> else raise <exception> 

Esiste un altro modo "bello" per fare questo ? Grazie

+0

Che cos'è * Samurai * qui? Cosa ne pensi di aggiungere alcuni dettagli? – Wolf

+1

Principio Samurai: torna vittorioso, o non farlo affatto. Se una funzione adempie alle proprie responsabilità, restituisce l'oggetto risultato appropriato e, in caso contrario, genera un'eccezione. –

+0

Oh, capisco. Forse qualche link sarebbe buono, come [Principio Samurai] (http://c2.com/cgi/wiki?SamuraiPrinciple) – Wolf

risposta

14

Inline/ternario if è un'espressione, non un'istruzione. Il tuo tentativo significa "se bool, restituisci il valore, altrimenti restituisci il risultato di raise expression" - il che è assurdamente ovvio, perché raise exception è esso stesso un'istruzione non un'espressione.

Non c'è modo di farlo in linea e non si dovrebbe desiderare. Farlo in modo esplicito:

if not bool: 
    raise MyException 
return value 
1

Beh, si potrebbe verificare l'bool separatamente:

if expr: raise exception('foo') 
return val 

In questo modo, si potrebbe verificare expr in precedenza.

1

mi piace farlo con asserzioni, in modo da sottolineare che il membro deve essere, come un contratto.

>>> def foo(self): 
...  assert self.value, "Not Found" 
...  return self.value 
+0

In tal modo non si aumenterebbe una specifica esecuzione, vero? –

+0

Ho anche notato che l'assert è, come in altri linguaggi, riprodotto solo quando su __debug__ così ig si trova un errore in runtime, lo asserirebbe pure? –

+0

Questo non è molto pythonic, ed è menzionato prima se si esegue l'interprete Python senza l'opzione di debuting gli asserzioni vengono ignorati ... P.D: -O: ottimizza leggermente il codice byte generato; anche PYTHONOPTIMIZE = x –

11

Se si vuole assolutamente raise in un'espressione, si potrebbe fare

def raiser(ex): raise ex 

return <value> if <bool> else raiser(<exception>) 

Questa "cerca" per restituire il valore di ritorno di raiser(), che sarebbe None, se non ci fosse incondizionata raise nella funzione.