带属性链的换行

Wrapping line with attribute chaining

我通常按照 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.

但是对于像这样的长线,我不确定推荐的方式是什么:

my_object = my_toolbox_with_a_pretty_long_name.some_subset_with_a_pretty_long_name_too.here_is_what_i_was_looking_for

关键是=后面的部分还是太长了,不知道where/how剪

1 - 展开成几行

我经常

toolbox = my_toolbox_with_a_pretty_long_name
subset = toolbox.some_subset_with_a_pretty_long_name_too
my_object = subset.here_is_what_i_was_looking_for

但它有点不同,因为它创建了中间变量,尽管在功能上它是等价的。另外,如果该行处于多重条件下,我真的不能这样做,比如 if a is not None and len(my_toolbox_..._for) == 42.

2 - 使用括号

这也有效:

my_object = (
    my_toolbox_with_a_pretty_long_name
   ).some_subset_with_a_pretty_long_name_too.here_is_what_i_was_looking_for

my_object = ((my_toolbox_with_a_pretty_long_name
              ).some_subset_with_a_pretty_long_name_too
             ).here_is_what_i_was_looking_for

但它在可读性方面非常糟糕,并且建议这样做以避免 85-ish 字符行让我看起来像一个 PEP8 纳粹分子。而且我什至不能让后者同时取悦 pylint 和 flake8。

你只需要一对括号:

my_object = (my_toolbox_with_a_pretty_long_name
.some_subset_with_a_pretty_long_name_too
.here_is_what_i_was_looking_for)

换行符在括号表达式中并不重要,它们可以出现在任何允许白色的地方-space。

对于你的另一个例子:

   if (a is not None 
       and len(my_toolbox_with_a_pretty_long_name
               .some_subset_with_a_pretty_long_name_too
               .here_is_what_i_was_looking_for) == 42):