2015-04-24 14 views
5

Mam zagnieżdżone OrderedDict, z którego chcę wyodrębnić wartość. Zanim jednak wydobędę tę wartość, muszę się upewnić, że istnieje długi łańcuch atrybutów i że ich wartości nie są żadne.Sprawdzanie, czy istnieje zagnieżdżony atrybut

Co jest najbardziej pythonic sposobem poprawy poniższy kod:

if 'first' in data and \ 
    data['first'] and \ 
    'second' in data['first'] and \ 
    data['first']['second'] and \ 
    'third' in data['first']['second'] and \ 
    data['first']['second']['third']: 
    x = data['first']['second']['third'] 

Odpowiedz

7

Innym sposobem byłoby użyć metody get():

x = data.get('first', {}).get('second', {}).get('third', None) 

Jeśli w dowolnym momencie klucz nie istnieje, następnie x = None

+0

to nie zadziała, jeśli jedno z pól jest ustawione na Brak. na przykład 'data = {'first': {'second': None}} ' – rob

2

Można go otoczyć w próbie/oprócz bloku tak:

try: 
    x = data['first']['second']['third'] 
    assert x 
except KeyError, AssertionError: 
    pass 
+1

'assert' nie powinno być tutaj użyte – vaultah

+0

Cóż, chciał, aby upewnić się, że wartość nie jest Brak, stąd powód, dla którego tam jest. – IcarianComplex

+0

Czy potrzebuję kolejnej próby blokowania catch dla każdego dodatkowego zadania? Na przykład. 'x = dane ['a']' i 'y = dane ['b']'. –

Powiązane problemy