2010-06-21 22 views
35

¿Cuál es la manera más sucinta de decir, en Python, "Dame dict['foo'] si existe, y si no, dame este otro valor bar"? Si estuviera utilizando un objeto en lugar de un diccionario, que haría uso de getattr:Python getattr equivalent for dictionaries?

getattr(obj, 'foo', bar) 

pero esto plantea un error de clave si intento usar un diccionario en su lugar (una distinción me parece lamentable que viene de JavaScript/CoffeeScript). Del mismo modo, en JavaScript/CoffeeScript solo escribiría

dict['foo'] || bar 

pero, nuevamente, esto arroja un KeyError. ¿Qué hacer? Algo sucinto, por favor!

Respuesta

58

dict.get(key, default) devuelve dict[key] si la clave en dict, de lo contrario, devuelve el valor predeterminado.

Tenga en cuenta que el valor predeterminado para default es None por lo que si usted dice dict.get(key) y la clave no está en dict entonces esto será simplemente volver None en lugar de criar a un KeyError como sucede cuando se utiliza la notación de acceso con llave [].

+0

Gracias, eso es justo lo que estaba buscando! Creo que acabas de establecer un nuevo récord de velocidad. –

+0

Oye, es posible hacer esto solo para una característica particular de la clave ... [Aquí] (http://stackoverflow.com/a/6467555/5961780), un valor solo se devuelve cuando 'clave', o más bien ' nombre ', comienza con la letra' f '. – sbrm1

5

También eche un vistazo a la clase defaultdict del módulo de colecciones. Es un dict para el que puede especificar lo que debe devolver cuando no se encuentra la clave. Con él puede hacer cosas como:

class MyDefaultObj: 
    def __init__(self): 
     self.a = 1 

from collections import defaultdict 
d = defaultdict(MyDefaultObj) 
i = d['NonExistentKey'] 
type(i) 
<instance of class MyDefalutObj> 

que le permite utilizar la familiar convención d [i].

Sin embargo, como se dijo mikej, .get() también funciona, pero aquí es la forma más cerca de su ejemplo de JavaScript:

d = {} 
i = d.get('NonExistentKey') or MyDefaultObj() 
# the reason this is slightly better than d.get('NonExistent', MyDefaultObj()) 
# is that instantiation of default value happens only when 'NonExistent' does not exist. 
# With d.get('NonExistent', MyDefaultObj()) you spin up a default every time you .get() 
type(i) 
<instance of class MyDefalutObj>