Hasta ahora, he utilizado generalmente una variación en la respuesta de Juan Fouhy - pero esto no es exactamente correcta, como señala Ethan:
assert gender in ('m', 'f')
if gender == 'm':
greeting = 'Mr.'
else:
greeting = 'Ms.'
El principal problema con el uso de una aserción es que si alguien va a su código con las banderas -O o -OO, las afirmaciones se optimizan. Como señala Ethan a continuación, eso significa que ahora no tiene ningún control de datos. Las aseveraciones son una ayuda al desarrollo y no deben usarse para la lógica de producción.Voy a entrar en el hábito de usar un cheque() función en lugar - esto permite la sintaxis de llamada limpia como una aserción:
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.'
Volviendo a la pregunta original, yo pretendo que el uso de una valer() o cheque() antes de la si/lógica demás es más fácil de leer, más seguro y más explícito:
- pone a prueba la calidad de los datos antes de empezar a actuar sobre ella - esto podría ser importante si hay operadores distintos de '==' en la cadena si/else
- se separa la prueba de la afirmación de la lógica de ramificación, en lugar de entrelazado de ellos - ésimo se hace que la lectura y la refactorización más fácil
tal vez debería decir "Pat"? –
No creo código inalcanzable es el término correcto para esto. Ver http://en.wikipedia.org/wiki/Unreachable_code – Unknown
@unknown ¿Qué sugeriría usted en su lugar? Sé que este ejemplo no es tan bueno, ya que el ciclo else es de facto alcanzable. Pero sucede que esa es exactamente la "medida de accesibilidad" que estoy buscando. – phihag