2012-04-24 10 views
14

Siguiendo "principio Samurai", que estoy tratando de hacer esto en mis funciones, pero parece que está mal ...sentencia raise en una expresión condicional

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

¿Hay alguna otra manera "hermosa" para hacer esto ? Gracias

+0

¿Qué es ese * Samurai * aquí? ¿Qué piensas acerca de agregar algunos detalles? – Wolf

+1

el Principio de Samurai: regresa victorioso, o nada en absoluto. Si una función cumple con sus responsabilidades, devuelve el objeto de resultado apropiado, y si no lo hace, lanza una excepción. –

+0

Oh, ya veo. Tal vez algún enlace sería bueno, como [Principio de Samurai] (http://c2.com/cgi/wiki?SamuraiPrinciple) – Wolf

Respuesta

14

Inline/ternary if es una expresión, no una afirmación. Su intento significa "si bool, return value, else return the result of raise expression" - lo cual es una tontería, por supuesto, porque raise exception es una declaración, no una expresión.

No hay forma de hacer esto en línea, y no debería querer. Hágalo explícitamente:

if not bool: 
    raise MyException 
return value 
1

Bueno, se podría probar la bool por separado:

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

De esta manera, se puede probar la expr anterior.

1

Me gusta hacerlo con aserciones, por lo que enfatiza que ese miembro debe ser, como un contrato.

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

De esta forma no plantearías una excepción específica, ¿o sí? –

+0

También he notado que assert es, como en otros idiomas, solo reproducido cuando está en __debug__, de modo que si encuentra un error en el tiempo de ejecución, ¿lo afirmaría también? –

+0

Esto no es muy pitónico, y se menciona antes si ejecuta el intérprete de Python sin la opción de debut, las afirmaciones se ignoran ... P.D: -O: optimice el bytecode generado levemente; también PYTHONOPTIMIZE = x –

11

Si a pesar de todo quiere raise en una expresión, que podría hacer

def raiser(ex): raise ex 

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

Este "intentos" para devolver el valor de retorno de raiser(), lo que sería None, si no había incondicional raise en la función.

Cuestiones relacionadas