2010-06-21 4 views
35

Quelle est la façon la plus succinte de dire, en Python, "Donne-moi dict['foo'] s'il existe, et sinon, donne-moi cette autre valeur bar"? Si j'étais à l'aide d'un objet plutôt qu'un dictionnaire, j'utiliser getattr:Python getattr équivalent pour les dictionnaires?

getattr(obj, 'foo', bar) 

mais déclenche une erreur clé si j'essayer d'utiliser un dictionnaire à la place (une distinction que je trouve dommage venant de JavaScript/CoffeeScript). De même, en JavaScript/CoffeeScript Je venais d'écrire

dict['foo'] || bar 

mais, encore une fois, cela donne un KeyError. Que faire? Quelque chose succincte, s'il vous plaît!

Répondre

58

dict.get(key, default) renvoie dict[key] si vous saisissez dict, else renvoie la valeur par défaut.

Notez que la valeur par défaut est defaultNone donc si vous dites dict.get(key) et la clé est pas dict alors ce sera juste retour None plutôt que d'élever un KeyError comme cela se produit lorsque vous utilisez la notation d'accès clé [].

+0

Merci, c'est exactement ce que je cherchais! Je pense que vous venez de définir un nouveau record de vitesse. –

+0

Hey est-il possible de le faire uniquement pour une caractéristique particulière de la clé ... [ici] (http://stackoverflow.com/a/6467555/5961780), une valeur est seulement retournée lorsque 'clé', ou plutôt ' name ', commence par la lettre' f '. – sbrm1

5

Jetez aussi un coup d'oeil à la classe defaultdict du module de collections. C'est une dict pour laquelle vous pouvez spécifier ce qu'il doit retourner quand la clé n'est pas trouvée. Avec lui, vous pouvez faire des choses comme:

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

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

qui vous permet d'utiliser la convention d [i] familière.

Cependant, comme l'a dit mikej, .get() fonctionne aussi, mais voici la forme plus proche de votre exemple 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> 
Questions connexes