Me encuentro usando mucho hasattr y me gustaría escribir de manera más concisa.

En JS, uso el siguiente patrón a menudo:

var x = variable || DEFAULT_VARIABLE;

¿Cuál es el equivalente en Python?

Algo mejor que esto ...

if hasattr(my_obj, 'my_key'):
  x = my_obj.my_key
else:
  x = 3

EDITAR: se corrigió un error que mezclaba objetos y dictos.

0
Jeff 14 jul. 2011 a las 22:00

3 respuestas

La mejor respuesta

Como estás hablando de JavaScript y hasattr, supongo que esta es una situación en la que variable no está definido. En Python, hasattr no prueba la presencia de claves de diccionario, solo prueba la presencia de atributos de objeto. Además, no hay una forma más simple que hasattr para probar si un objeto tiene un atributo en Python, porque a diferencia de JavaScript, los nombres de las variables deben estar definidos para ser utilizados. Por lo tanto, para referirse a un nombre de variable que puede o no estar definido, debe usar una cadena.

Dicho esto, puede usar el operador ternario + hasattr para escribir la prueba en una línea:

>>> class F(object):
...     pass
... 
>>> f = F()
>>> f.foo = 5
>>> f.bar if hasattr(f, 'bar') else 10
10
>>> f.foo if hasattr(f, 'foo') else 10
5

Esto funciona porque f.foo ni siquiera se evalúa si hasattr devuelve False.

También puede definir f.foo = None y usar or como Wooble sugiere en su comentario.

Para probar si una clave está en un diccionario, diga if k in d:, y para obtener un valor predeterminado si k no está en el diccionario, si eso es lo que desea, vea S.La respuesta de Scott .

1
Community 23 may. 2017 a las 12:04
x=variable if variable else DEFAULT_VARIABLE

No recuerdo si esto funciona con todas las versiones de Python ...

1
krs1 14 jul. 2011 a las 18:07
x = my_dict.get('my_key', 3)

Eso parece claro: http://docs.python.org/library/stdtypes.html # dict.get

Suponiendo, por supuesto, que my_dict realmente es un diccionario. Todo hasattr en la pregunta es confuso.

4
S.Lott 14 jul. 2011 a las 18:13