Fino ad ora, ho di solito usato una variazione sul risposta di John Fouhy - ma questo non è esattamente corretto, come sottolinea Ethan:
assert gender in ('m', 'f')
if gender == 'm':
greeting = 'Mr.'
else:
greeting = 'Ms.'
Il problema principale con l'utilizzo di un'asserzione è che se qualcuno corre il vostro codice con i flag -O o -OO, i richiami vengono ottimizzati. Come Ethan indica di seguito, ciò significa che ora non hai alcun controllo dei dati. Le asserzioni sono un aiuto allo sviluppo e non dovrebbero essere utilizzate per la logica di produzione.Vado a prendere l'abitudine di usare un controllo funzionale() invece - questo permette per la sintassi chiamata pulito come un'asserzione:
def check(condition, msg=None):
if not condition:
raise ValueError(msg or '')
check(gender in ('m', 'f'))
if gender == 'm':
greeting = 'Mr.'
else:
greeting = 'Ms.'
Tornando alla domanda iniziale, mi sostengo che l'utilizzo di un assert() o controllare() prima del caso/logica il resto è più facile da leggere, più sicuro e più esplicito:
- mette alla prova la qualità dei dati prima di iniziare ad agire su di esso - questo potrebbe essere importante se ci sono operatori diversi da '==' nella catena if/else
- separa il test di asserzione dalla logica di branching, invece di interlacciarli - th rende la lettura e il refactoring più semplici
Forse dovrebbe dire "Pat"? –
Non penso che il codice irraggiungibile sia il termine corretto per questo. Vedi http://en.wikipedia.org/wiki/Unreachable_code – Unknown
@unknown Che cosa suggeriresti invece? So che questo esempio non è buono, dato che il ciclo alternativo è di fatto raggiungibile. Ma come succede, è esattamente la "misura della raggiungibilità" che sto cercando. – phihag