2015-04-24 26 views
5

İçinde bir değer elde etmek istediğim iç içe geçmiş bir OrderedDict var. Ama bu değeri çıkarabilmeden önce, uzun bir öznitelik zincirinin varolduğundan ve değerlerinin hiçbirinin olmadığından emin olmalıyım.Yuvalanmış özniteliğin var olup olmadığını kontrol etme

Aşağıdaki kodu artırmanın en pythonic yolu nedir:

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'] 

cevap

7

başka rota get() yöntemi kullanmak olacaktır:

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

herhangi bir noktada anahtar yoksa

, x = None

+0

Bu alanlardan biri Yok olarak ayarlanmışsa, bu çalışmaz. Örneğin. 'data = {'first': {'second': None}} ' – rob

2

Aşağıdaki gibi bir try/except bloğu içinde çevreleyebilirsiniz:

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

'assert' burada kullanılmamalıdır – vaultah

+0

Değerin hiçbiri olmadığından emin olmak istedim, dolayısıyla orada olmasının nedeni. – IcarianComplex

+0

Her ek görev için başka bir try catch bloğuna ihtiyacım var mı? Örneğin. 'x = veri ['a']' ve 'y = veri ['b']'. –

İlgili konular