ternario - Operador de asignación condicional de Python
python ternary operator (10)
(No puedo comentar o simplemente lo haría) Creo que la sugerencia de verificar a los lugareños de arriba no es del todo correcta. Debería ser:
foo = foo if ''foo'' in locals() or ''foo'' in globals() else ''default''
ser correcto en todos los contextos.
Sin embargo, a pesar de sus votos positivos, no creo que sea un buen análogo para el operador de Ruby. Dado que el operador de Ruby permite más que un simple nombre a la izquierda:
foo[12] ||= something
foo.bar ||= something
El método de excepción es probablemente el análogo más cercano.
¿Existe un Python equivalente al operador Ruby ||=
("establecer la variable si la variable no está configurada")?
Ejemplo en Ruby:
variable_not_set ||= ''bla bla''
variable_not_set == ''bla bla''
variable_set = ''pi pi''
variable_set ||= ''bla bla''
variable_set == ''pi pi''
Creo que lo que estás buscando, si estás buscando algo en un diccionario, es el método setdefault
:
(Pdb) we=dict()
(Pdb) we.setdefault(''e'',14)
14
(Pdb) we[''e'']
14
(Pdb) we[''r'']="p"
(Pdb) we.setdefault(''r'',''jeff'')
''p''
(Pdb) we[''r'']
''p''
(Pdb) we[e]
*** NameError: name ''e'' is not defined
(Pdb) we[''e'']
14
(Pdb) we[''q2'']
*** KeyError: ''q2'' (Pdb)
Lo importante a tener en cuenta en mi ejemplo es que el método setdefault
cambia el diccionario si y solo si la clave a la que hace referencia el método setdefault
no está presente.
Hay una asignación condicional en Python 2.5 y posterior: la sintaxis no es muy obvia, por lo tanto, es fácil pasar por alto. Así es como lo haces:
x = true_value if condition else false_value
Para obtener más información, consulte los documentos Python 2.5 .
Me sorprende que nadie haya ofrecido esta respuesta. No es tan "integrado" como el de Ruby ||=
pero es básicamente equivalente y sigue siendo un trazador de líneas:
foo = foo if ''foo'' in locals() else ''default''
Por supuesto, los locals()
son solo un diccionario, por lo que puedes hacer:
foo = locals().get(''foo'', ''default'')
No estoy seguro de entender la pregunta correctamente aquí ... Intentar "leer" el valor de un nombre de variable "indefinido" activará un NameError
. (ver aquí, que Python tiene "nombres" , no variables ...).
== EDITAR ==
Como se señala en los comentarios de delnan, el siguiente código no es sólido y se romperá en numerosas situaciones ...
Sin embargo, si su variable "existe", pero tiene algún tipo de valor ficticio, como None
, lo siguiente funcionaría:
>>> my_possibly_None_value = None
>>> myval = my_possibly_None_value or 5
>>> myval
5
>>> my_possibly_None_value = 12
>>> myval = my_possibly_None_value or 5
>>> myval
12
>>>
No, el reemplazo es:
try:
v
except NameError:
v = ''bla bla''
Sin embargo, querer usar esta construcción es un signo de un flujo de código demasiado complicado. Por lo general, harías lo siguiente:
try:
v = complicated()
except ComplicatedError: # complicated failed
v = ''fallback value''
y nunca estar seguro si v
está configurado o no. Si es una de las muchas opciones que se pueden establecer o no, use un diccionario y su método get
, que permite un valor predeterminado.
No, no hay tonterías como esa. Algo que no nos hemos perdido en Python durante 20 años.
No, no saber qué variables se definen es un error, no una característica en Python.
Use dicts en su lugar:
d = {}
d.setdefault(''key'', 1)
d[''key''] == 1
d[''key''] = 2
d.setdefault(''key'', 1)
d[''key''] == 2
Normalmente hago esto de la siguiente manera:
def set_if_not_exists(obj,attr,value):
if not hasattr(obj,attr): setattr(obj,attr,value)
yo usaría
x = ''default'' if not x else x
Mucho más corto que todas sus alternativas sugeridas aquí, y directo al grano. Lea, "configure x como ''predeterminado'' si x no está configurado, de lo contrario, guárdelo como x." Sin embargo, si necesita que None
, 0
, False
o ""
sean valores válidos, tendrá que cambiar este comportamiento, por ejemplo:
valid_vals = ("", 0, False) # We want None to be the only un-set value
x = ''default'' if not x and x not in valid_vals else x
Este tipo de cosas también es una mera necesidad de convertirse en una función que pueda usar en cualquier lugar fácilmente:
setval_if = lambda val: ''default'' if not val and val not in valid_vals else val
en ese punto, puede usarlo como:
>>> x = None # To set it to something not valid
>>> x = setval_if(x) # Using our special function is short and sweet now!
>>> print x # Let''s check to make sure our None valued variable actually got set
''default''
Finalmente, si realmente está perdiendo su notación de infijo de Ruby, podría sobrecargar ||=|
(o algo similar) siguiendo el truco de este tipo: http://code.activestate.com/recipes/384122-infix-operators/