2013-04-24 38 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

如果键已经在列表中,并且您知道该值存在,那么您可以:'value = reduce(dict.get,keys,dct)'。 – jfs 2013-04-25 05:53:20

回答

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 2013-04-24 23:59:31

+0

如果您需要设置一个值,第一种方法不会对您有所帮助。 – tponthieux 2013-04-25 04:54:09

+0

@tponthieux:当然可以。 'a'只是'dct'中内部字典的名称。在这种情况下,a [k] = v'相当于'dct ['long_key_name_one'] ['long_key_name_two'] [k] = v'。 – jfs 2013-04-25 05:53:56

3

如果你用它在函数内部(和你可以使用print()作为函数,因为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'])