2013-04-24 19 views
13

Derin sözlük erişimi yapmak için pep8 uyumlu yol nedir?pep8 uyumlu derin sözlük erişimi

dct = { 
    'long_key_name_one': { 
     'long_key_name_two': { 
      'long_key_name_three': { 
       'long_key_name_four': { 
        'long_key_name_five': 1 
       } 
      } 
     } 
    } 
} 

E501 satırı çok uzun (118> 80 karakter) önce

print dct['long_key_name_one']['long_key_name_two']['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

E211 boşluk '['

print dct['long_key_name_one']['long_key_name_two']\ 
    ['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

E124 kapanış ayracı görsel girinti eşleşmiyor

print dct['long_key_name_one']['long_key_name_two' 
    ]['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

Bu pep8 geçer ama hoş görünüyor ve pep8 uyumlu olacak şekilde çizgi kırmak için bir yol var mı

print dct['long_key_name_one']['long_key_name_two'][ 
    'long_key_name_three' 
]['long_key_name_four']['long_key_name_five'] 

ideal daha az görünüyor?

+2

Anahtarlar zaten bir listede bulunuyorsa ve değerin var olduğunu biliyorsanız o zaman şunları yapabilirsiniz: 'value = küçült (dict.get, keys, dct)'. – jfs

cevap

6
Belki

değil en iyi yolu, ama işe yarıyor:

a = dct['long_key_name_one']['long_key_name_two'] 
b = a['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

Ama aynı zamanda önerilen yöntem olan çalışan bu: Bir fonksiyon içerisinde kullanırsanız

print (dct['long_key_name_one']['long_key_name_two'] 
     ['long_key_name_three']['long_key_name_four'] 
     ['long_key_name_five']) 
+1

Bence ilk yol en iyi seçenek. Bunun dışında, en iyi seçenek veri yapılarınızı daha iyi tasarlamaktır; Ara seviyelerin hiçbirinin kendi başına yararlı olmadığı 5 seviyeli bir nesneler ağacının olduğu birçok durum yok - ve eğer böyle bir durum varsa, muhtemelen bir ağaç kullanmanız daha iyi olur Yineleyici veya DOM tarzı aramalar bu tür erişimden daha fazladır. – abarnert

+0

Bir değer ayarlamanız gerekirse, ilk yol size yardımcı olmaz. – tponthieux

+0

@tponthieux: Elbette öyle. 'a'' dct'de dahili sözlük için bir isim. 'a [k] = v', bu durumda dct ['long_key_name_one'] ['long_key_name_two'] [k] = v' öğesine eşdeğerdir. – jfs

3

(ve yapabildin sadece bir parantez içinde örtülü birleştirme kullanabilirsiniz

afaik 2.7'ye) beri bir fonksiyonu olarak print() kullanın

print(dct['long_key_name_one'] 
     ['long_key_name_two'] 
     ['long_key_name_three'] 
     ['long_key_name_four'] 
     ['long_key_name_five'])