2011-07-15 29 views
15

que tienden a utilizar mucho en esto, pero es feo:mejor manera de hacer la asignación condicional en Python

a = (lambda x: x if x else y)(get_something()) 

Así que escribí esta función:

def either(val, alt): 
    if val: 
     return val 
    else: 
     return alt 

lo que puede hacer:

a = either(get_something(), y) 

¿Hay una función incorporada para esto (similar a ISNULL en T-SQL)?

Respuesta

34

El operador or hace lo que desea:

get_something() or y 

En hecho, es chainable, como COALESCE (ya diferencia de ISNULL). La siguiente expresión se evalúa como el argumento de la izquierda que convierte a True.

A or B or C 
+0

Gracias. Ja, en realidad estaba intentando eso, pero lo descarté al probar 'a = 0 o Ninguno' y la consola no imprimió nada. Pero intentar 'a es ninguno' después de eso da 'Verdadero', además de que quiero la funcionalidad 'Ninguno o 0' de todos modos (llegando tarde) :) Por cierto, gracias por la respuesta rápida. – crizCraig

+3

Solo para el registro, si va a encadenar el operador 'y', evaluará el argumento de la derecha que convierta a True si todos los argumentos o el argumento de la izquierda que convierte a False si alguno se convierte en False. –

+1

"a = 0 o None" Bueno, por supuesto, la consola no imprimirá nada, está asignando el resultado de '0 o None' a' a', y las variables con 'None' asignadas a ellas no se muestran automáticamente 'Ninguno' cuando se muestra en la consola. Tienes que usar específicamente 'repr',' str', o 'print'. O algo así. – JAB

3

Se puede utilizar un simple or, así:

>>> a = None 
>>> b = 1 
>>> c = (a or b) # parentheses are optional 
>>> c 
1 
5

puede utilizar:

a = get_something() or y 

Si get_something es True en contexto booleano, se le asignará su valor a a . De lo contrario, y se asignará al a.

2

¡Fácil!

Para más código condicional:

a = b if b else val 

Para su código:

a = get_something() if get_something() else val 

Con eso se puede hacer condiciones complejas como esto:

a = get_something() if get_something()/2!=0 else val 
+4

Excepto que esto llama 'get_something' dos veces. –

+1

puede poner get_somthing en una variable. Solo con O no puedes poner condiciones para trabajar. –

+1

¿De verdad? ¿por qué merece un -1? –

1

También estoy usando el (a,b)[condition based on the value of a] formulario, guardando el resultado de la llamada get_something() en a, en los raros casos que se presentan mejor aquí: http://mail.python.org/pipermail/python-list/2002-September/785515.html

... 
a=0  b=None  a or b => None  (a,b)[a is None] => 0 
a=() b=None  a or b => None  (a,b)[a is None] =>() 
... 
+0

Ya veo. Esto sería si quisiera verificar 'a' para una condición más específica. Pero necesitas dos líneas, así que iría con 'a = x if condition else y', que es más legible. Interesante sintaxis sin embargo. Nunca he visto algo así :) – crizCraig

+0

@crizCraig: agregó un pequeño ejemplo – alexandrul

3

que he proporcionado una respuesta a esta pregunta a otro usuario. Échale un vistazo aquí:

Answer to similar question

para responder rápidamente aquí, hacer:

x = true_value si la condición demás false_value

Cuestiones relacionadas