包含属性链接的换行

时间:2017-05-23 09:41:02

标签: python pep8 linewrap

我通常根据PEP8

中的建议使用括号括起长行
  

包装长行的首选方法是在括号,括号和括号内使用Python隐含的行继续。通过在括号中包装表达式,可以在多行中分割长行。这些应该优先使用反斜杠来继续行。

但是在像这样的长线的情况下,我不确定推荐的方式是什么:

my_object = my_toolbox_with_a_pretty_long_name.some_subset_with_a_pretty_long_name_too.here_is_what_i_was_looking_for

关键是即使=符号之后的部分仍然太长而且我不知道在哪里/如何切割。

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。

1 个答案:

答案 0 :(得分:4)

您只需要一对括号:

my_object = (my_toolbox_with_a_pretty_long_name
.some_subset_with_a_pretty_long_name_too
.here_is_what_i_was_looking_for)

换行符表达式中的换行符不重要,它们可以在允许使用空格的任何地方出现。

对于你的另一个例子:

   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):