断线访问字典的正确方法

Proper way of breaking line accessing dictionary

我尝试遵守 pep8 指令,因此打破以下行:

   config_data_dict['foo']['bar']['foobarfoo'] \
        ['barfoobar'] = something_else

然而,我在 ['foobarfoo'] 部分

之后收到以下警告

whitespace before '[' pep8(E211)

我应该如何像上面那样正确地断线(假设我不能在 = 周围刹车)?

你有很多方法可以做到这一点,但这是我对 2 种“最佳”方法的看法。 (我说得最好,因为观点和上下文确实适用)

使用 operator.setitem. (this is almost the same as described in 但对我来说看起来更具可读性,因为它没有前导括号)

setitem(config_data_dict
    ['foo']['bar']['foobarfoo'],
    'barfoobar', something_else)

或者有些人更喜欢 reduce 方法和 operator.getitem. (also alike 如果你的嵌套真的很深,reduce 方法可能更容易理解,但我更喜欢后者,因为它不会再增加一些混入不必要的功能)

path = ['foo','bar','foobarfoo']
reduce(getitem, path, config_data_dict)['barfoobar'] = something_else

或者为了更好地缩进使用 setitem 这里也

setitem(reduce(getitem, path, config_data_dict),
    'barfoobar', something_else)

综上所述,您可以使用更短的变量名,例如 config_data_dict 确实不需要末尾的字典。它确实使变量更具描述性,尽管我相信大多数人应该能够通过访问它的方式轻松辨别它是一个指令。

您可以在 [...] 内中断(虽然我不确定哪个会被认为更具可读性:在 [ 之后或 ] 之前中断,或两者兼而有之):

config_data_dict[
    'foo'][
    'bar'][
    'foobarfoo'][
    'barfoobar'] = something_else

一般来说,要么将所有键放在同一行,要么将每个键放在单独的一行。这适用于其他答案中使用的显式括号,例如

(config_data_dict
     ['foo']
     ['bar']
     ['foobarfoo']
     ['barfoobar']) = something_else

但是,我会只使用一个或多个临时变量:

d = config_data_dict['foo']['bar']['foobarfoo']
d['barfoobar'] = something_else

括号似乎有效:

(config_data_dict['foo']['bar']['foobarfoo']
 ['barfoobar']) = something_else

这似乎也是 PEP8 推荐的样式:

The preferred way of wrapping long lines is by using Python's implied line continuation inside parentheses, brackets and braces. Long lines can be broken over multiple lines by wrapping expressions in parentheses. These should be used in preference to using a backslash for line continuation.