【问题标题】:pep8 compliant deep dictionary access符合 pep8 的深度字典访问
【发布时间】:2013-04-18 17:13:15
【问题描述】:

什么是符合 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 标准?

【问题讨论】:

  • 如果键已经在列表中并且您知道该值存在,那么您可以:value = reduce(dict.get, keys, dct)。

标签: python pep8


【解决方案1】:

也许不是最好的方法,但它确实有效:

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

【讨论】:

  • 我认为第一种方式是最好的选择。除此之外,最好的选择是更好地设计数据结构,这样一开始就不会遇到这种情况。在很多情况下,您拥有 5 层深的对象树,其中没有一个中间层单独有用 — 而且,如果您确实有这种情况,那么您使用树迭代器或 DOM 样式的搜索可能比这种访问更好。
  • 如果您需要设置值,第一种方法对您没有帮助。
  • @tponthieux:确实如此。 a 只是dct 中内部字典的名称。在这种情况下,a[k] = v 等同于 dct['long_key_name_one']['long_key_name_two'][k] = v。
  • 啊,你是对的:id(dct['long_key_name_one']['long_key_name_two']) == id(a)
【解决方案2】:

如果你在一个函数中使用它(并且你可以使用 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'])

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 2016-06-23
    • 2021-01-03
    • 2021-05-28
    • 2017-02-21
    • 2014-10-17
    • 2013-02-11
    • 2015-11-17
    相关资源
    最近更新 更多