2010-08-09 5 views

Répondre

13
d2.get('ham', {}).get('fry', 88) 

Je le décomposerais probablement en plusieurs instructions dans la vie réelle.

ham = d2.get('ham', {}) 
fry = ham.get('fry', 88) 
+3

plutôt 'd2.get ('ham', {}). Get ('fry', 99)', non? (DRY!) – mykhal

+1

Rendre quelque chose de plus lisible! = Se répéter. Vous répéter serait d'écrire une fonction pour obtenir des frites de jambon, puis une autre fonction pour obtenir des fritures de spam, quand les deux fonctions pourraient être écrites comme une fonction qui prend le jambon/spam comme paramètre. –

+0

@Jesse, La version précédente avait deux références à «fry» et deux références au nombre magique renvoyé. La suggestion était une nette amélioration. – Oddthinking

3

Pour les valeurs par défaut d'arriver à correctement le premier défaut doit être un dictionnaire, de sorte que vous pouvez enchaîner les appels .get correctement si le premier échoue.

d.get('ham',{}).get('fry',88) 

vous pouvez également utiliser un essai, sauf le bloc

def get_ham_fry() 
    try: 
    return d['ham']['fry'] 
    except AttributeError,e: 
    return 88 
+0

L'indexation des chaînes soulève soit 'KeyError' si aucune clé n'est trouvée, ou un' TypeError' si l'item ne supporte pas l'indexation des chaînes.Je pense que 'AttributeError' est seulement approprié pour les appels' get' –

3

Si vous devez faire beaucoup, vous pouvez écrire une fonction d'aide

def get_nested(d, list_of_keys, default): 
    for k in list_of_keys: 
     if k not in d: 
      return default 
     d=d[k] 
    return d 

print get_nested(d2,['ham','spam'],99) 
print get_nested(d2,['ham','grill'],99) 
+0

Feel like reduce. 'Functools.reduce (lambda d, x: d [x] si x dans d autre défaut, ['ham', 'spam'], d2) ' – kennytm

+1

@KennyTM, ce qui soulève un' TypeError' pour '['bacon', 'spam']' –

0

Voici une solution pour traiter avec des dictionnaires imbriqués:

def get(root, *keys): 
    """ 
    Returns root[k_1][k_2]...[k_n] if all k_1, ..., k_n are valid keys/indices. 
    Returns None otherwise 
    """ 
    if not keys: 
     return root 
    if keys[0] not in root: 
     return None 
    if keys[0] in root: 
     return get(root[keys[0]], *keys[1:]) 

Utilisation:

>>> d = {'a': 1, 'b': {'c': 3}} 
>>> get(d, 'b', 'c') 
3 
>>> get(d. 'key that's not in d') 
None 
>>> get(d) 
{'a': 1, 'b': {'c': 3}} 
Questions connexes