2008-12-06 12 views
7

Me encontré con este modismo en un Python de código abierto, y me atraganté con mi bebida.¿Es este idioma pitónico? (someBool y "True Result" o "False Result")

En lugar de:

if isUp: 
    return "Up" 
else: 
    return "Down" 

o incluso:

return "Up" if isUp else "Down" 

el código lee:

return isUp and "Up" or "Down" 

puedo ver que este es el mismo resultado, pero esto es un lenguaje típico en Python? Si es así, ¿es algún truco de rendimiento que corre rápido? ¿O es solo una vez que necesita una revisión del código?

Respuesta

17

El modismo "a y b o c" era la forma canónica de expresar la aritmética ternaria si en Python, antes de PEP 308 se escribió e implementó. Este modismo falla, la respuesta "b" es falsa; para apoyar el caso general, se podría escribir

return (a and [b] or [c])[0] 

Una forma alternativa de la ortografía era

return (b,c)[not a] 

que, con la introducción del tipo bool, podría ser reescrita como

return (c,b)[bool(a)] 

(en caso de que no esté claro: la conversión a bool, y el operador no, es necesario si a no se sabe que bool ya)

Hoy, la sintaxis de expresión condicional se debe usar si la cosa debe ser una expresión; de lo contrario, recomiendo usar la declaración if.

+4

La sintaxis alternativa tiene una diferencia con el/y el método o el operador ternario: ambos valores siempre se evalúan. No es gran cosa si solo son variables, pero si hay llamadas a funciones (especialmente con efectos secundarios) allí, hará la diferencia. – Brian

0

Ese código es muy grande e inteligente para mi gusto, pero supongo que no hay nada de malo en ello. Creo que esto es solo un caso del síndrome de "hacer que todo encaje en una sola línea".

Yo personalmente hubiera optado por la primera forma.

-1

No, no lo es.

Tuve de alguna manera similar question el otro día.

si la construcción

val if cond else alt 

no fue muy bienvenido (al menos por la comunidad SO) y la preferida era:

if cond: 
    val 
else: 
    alt 

Usted puede conseguir su propia conclusión. :)

-1

Yikes. No es legible en absoluto. Para mí, pythonic significa fácil de leer.

return isUp and "Up" or "Down" 

Suena algo que harías en perl.

9

Debe leer Using the and-or trick (sección 4.6.1) de Inmersión en Python por Mark Pilgrim.Resulta que el truco y o tiene grandes trampas que debes tener en cuenta.

Cuestiones relacionadas