2012-05-24 14 views
5

estoy atascado en este ejemplo particular de Inmersión en PythonInmersión en Python y-o falle

Ejemplo 4.18. Cuando el truco and-or falla

>>>>a = "" 
>>>>b = "second" 
>>>1 and a or b 
>>>>'second' 

Como a es una cadena vacía, que Python considera falso en un contexto booleano, 1 y '' dé como '', y entonces '' o 'segundo' evalúa a 'segundo'. Oops! Eso no es lo que querías. El and-or truco, bool y aob, no funcionarán como la expresión C bool? a: b cuando a es falso en un contexto booleano .

¿Por qué dice que no es lo que el usuario quiere, quiero decir 1 y "" lo evaluaría como False, mientras que "" o b lo evaluaría como "segundo", eso es exactamente lo que debería suceder, no lo hago entiendo por qué está mal? ¿Me estoy perdiendo algo?

Respuesta

4

No, no le falta algo.

El condicional en línea expr if cond else expr se introdujo en Python 2.5 en PEP 308; antes de eso, tenían que ser condicionales de la forma completa

if cond: 
    expr 
else: 
    expr 

Sin embargo, la gente cuenta de que expr and cond or expr tipo de trabajado como una línea condicional, siempre que las primeras expresiones pasaron a evaluar a booleano verdadero. Como la mayoría de las cosas en Python son ciertas, esta sintaxis en general tendía a funcionar, y luego, por supuesto, algunas veces fallaba. De hecho, esta fue la motivación para agregar el condicional en línea "apropiado".

2

El "and-or trick" se usó para emular el operador condicional ternario, condition ? if-true : if-false o similar. Como 1 es equivalente a True en contexto booleano, se espera que la expresión arroje a, no b. Entonces, la lección es, no uses ni-o truco. Python tiene condicional ternario desde 2,5:

true if condition else false 
+0

Gracias. Pensé que hay algo más que no entiendo. –

2

Inmersión en Python no es un buen tutorial y should not be followed


La expresión x and y or z se utilizó antes de pitón tenía una expresión ternaria adecuada (y if x else z). Esta sección explica por qué puede sorprenderle si espera que se comporte como C x ? y : z.


Hay una lista de tutoriales en la python wiki. que podrían dar un mayor recurso hasta la fecha.

+0

Niza zed shaw rant. – gary

+0

¿Qué debería seguir entonces ?, pensé que sumergirme en Python debería ser suficiente como ejemplos. Soy consciente de la sintaxis, estaba buscando, por ejemplo, para ver cómo se puede hacer mejor con Python –

+0

@KartikAnand: El enlace en mi respuesta tiene muchas opciones en la sección "Learning Python" (donde puede notar que DIP no está presente en ninguna forma). – Daenyth

0

¿Por qué se dice que no es lo que el usuario quiere, me refiero a 1 y "" habría resultado false, mientras que "" aob se evaluará como "segundo", eso es perfectamente lo que debe suceder, No entiendo por qué está mal? ¿Estoy perdiendo algo?

Siento que esta parte de la pregunta está siendo ignorada. condition and if-true or if-false es un truco utilizado en las versiones> 2.5, como se explica en otras respuestas, para imitar a otros idiomas 'condition ? if-true : if-false o versiones posteriores' if-true if condition else if-false.

El problema con esto es que si if-true es un objeto que se evalúa como falsa ("", [], (), False o 0), entonces esto sería un error, como se esperaba cuando se mira a la evaluación, pero que podría colarse como un error si if-true se establece dinámicamente y se puede evaluar como falso.

El resultado esperado de ingenuidad condition and a or b habría sido el contenido de a ("", cadena vacía), como la condición (1) evalúa a true, sino como 1 and a evalúa a false para que pueda obtener el contenido de b.

La solución a este problema es utilizar la sintaxis de Python 2.5+ (if-true if condition else if-false) o asegurarse de que if-true nunca sea falso. Una forma de lograr el segundo es para empacar if-true y if-false en una tupla o lista, como iterables no vacío es siempre verdad:

>>> a = "" 
>>> b = "second" 
>>> condition = 1 
>>> condition and a or b 
'second' 

>>> condition and [a] or [b] 
[''] 

>>> (condition and [a] or [b])[0] 
'' 

Es un tipo de solución feo, pero está ahí si es necesario apuntar a las versiones antiguas de Python.

+0

en realidad, lo que dijiste ya está dado en el libro, y mi pregunta no es cómo rectificar el error, mi pregunta es por qué el autor dice "no es lo que el usuario esperaba". En realidad, usted respondió mi pregunta en la primera parte de su respuesta, no había necesidad de código y gracias :) –

+0

@KartikAnand: claro, solo quería para asegurarse de que si alguien encuentra esta pregunta en el futuro, tendrá el contexto completo :) – voyager

Cuestiones relacionadas