2013-04-24 3 views
13

Что такое pep8-совместимый способ сделать глубокий доступ к словарю?pep8 совместимый глубокий доступ к словарю

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

E501 линия слишком длинные (118> 80 символов)

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

E211 пробельные до того '['

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

закрытие E124 кронштейн не соответствует визуальным отступам

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

Это передает pep8 но, кажется, меньше, чем идеал

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

Есть ли способ, чтобы разбить линию так, чтобы она выглядит красиво и pep8 соответствует?

+2

Если ключи уже находятся в списке, и вы знаете, что это значение существует, вы можете: 'значение = уменьшить (dict.get, keys, dct)'. – jfs

ответ

6

Возможно, не самый лучший способ, но он работает:

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

Но это также работает, что предложенный метод:

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

Я думаю, что первый способ - лучший вариант. Кроме того, действительно, лучший вариант - лучше сконструировать ваши структуры данных, чтобы вы не столкнулись с этим в первую очередь. Существует не так много случаев, когда у вас есть дерево объектов на 5 уровнях, где ни один из промежуточных уровней не полезен сам по себе, и, если у вас есть такой случай, вам, вероятно, лучше использовать дерево итератор или поиск в стиле DOM, чем этот вид доступа. – abarnert

+0

Первый способ не поможет вам, если вам нужно установить значение. – tponthieux

+0

@tponthieux: конечно. 'a' - просто имя внутреннего словаря в' dct'. 'a [k] = v' эквивалентно' dct ['long_key_name_one'] ['long_key_name_two'] [k] = v' в этом случае. – jfs

3

Если вы используете его внутри функции (и вы могли бы использовать печать() как функция, так как 2,7 AFAIK)

Вы могли бы просто использовать неявную конкатенацию в скобках

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