42 votes

Python getattr équivalent pour les dictionnaires?

Quelle est la plus succincte façon de dire, en Python, "Donnez-moi dict['foo'] si elle existe, et si non, donnez-moi cet autre valeur bar"? Si je ont été à l'aide d'un objet plutôt qu'un dictionnaire, je ne l'utiliserais getattr:

getattr(obj, 'foo', bar)

mais cela soulève une clé d'erreur si j'essaie, à l'aide d'un dictionnaire de la place (une distinction que je trouve dommage de venir à partir 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 de succinct, s'il vous plaît!

70voto

mikej Points 30224

dict.get(key, default) renvoie dict[key] si la saisie est dict, sinon renvoie la valeur par défaut.

Notez que la valeur par défaut pour default est None donc si vous dites dict.get(key) et que la clé n'est pas dictée, cela renverra simplement None plutôt que d'augmenter un KeyError comme cela se produit lorsque vous utilisez la notation d'accès aux touches [] .

5voto

ddotsenko Points 2036

Jetez également un œil à la classe defaultdict du module collections. C'est un dict pour lequel vous pouvez spécifier ce qu'il doit retourner lorsque 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 familière d [i].

Cependant, comme l'a dit mikej, .get () fonctionne également, mais voici le formulaire 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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X