在Python中链接方法时纠正换行符的样式

时间:2011-10-30 00:26:38

标签: python coding-style line-breaks pep8

我有一些像这样的代码。中断之前或之后是否应该发生?

# before
my_var = somethinglikethis.where(we=do_things).where(we=domore).where(we=everdomore)

# this way
my_var = somethinglikethis.where(we=do_things) \
                          .where(we=domore) \
                          .where(we=everdomore)

# or this way
my_var = somethinglikethis.where(we=do_things). \
                           where(we=domore). \
                           where(we=everdomore)

5 个答案:

答案 0 :(得分:60)

PEP 8建议使用括号,这样您就不需要\,并轻轻地建议在二元运算符之前而不是之后打破。因此,格式化代码的首选方法是这样的:

my_var = (somethinglikethis
          .where(we=do_things)
          .where(we=domore)
          .where(we=everdomore))

这两个相关段落来自Maximum Line Length部分:

  

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

...以及整个Should a line break before or after a binary operator?部分:

如果换行符在二元运算符之前或之后?

几十年来,推荐的风格是在二元运算符之后打破。 但这可能会在两个方面损害可读性:运营商倾向于获得 分散在屏幕上的不同列上,每个操作符都是 从其操作数移开到前一行。在这里,眼睛 必须做额外的工作来判断添加了哪些项目以及哪些项目 减去:

# No: operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

解决这个可读性问题,数学家及其出版商 遵循相反的惯例。唐纳德克努特解释了传统 他的计算机和排版系列中的规则:“虽然公式 在一个段落内总是在二元操作和关系之后中断, 显示的公式总是在二进制运算之前中断“

遵循数学传统通常会产生更多 可读代码:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

在Python代码中,允许在二进制文件之前或之后中断 运算符,只要约定在本地一致。对于新的 代码Knuth的风格是建议的。

请注意,正如上面的引文所示,PEP 8 使用给出了关于在哪里打破运营商的相反建议,下面引用后代:

  

包装长行的首选方法是使用Python的隐含行   在括号,括号和括号内继续。长线可以   通过在括号中包装表达式来分解多行。这些   应该优先使用反斜杠来继续行。   确保适当缩进续行。首选的地方   在运算符之后打破二元运算符,而不是之前。   一些例子:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
            color == 'red' and emphasis == 'strong' or
            highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

答案 1 :(得分:4)

PEP 8表示首选在运营商之前打破:

  

Donald Knuth在他的计算机和排版系列中解释了传统规则:“虽然段落中的公式总是在二元操作和关系之后中断,但显示的公式总是在二元操作之前中断”。

     

...

     

在Python代码中,只要约定在本地一致,就允许在二元运算符之前或之后中断。对于新代码,建议使用Knuth的风格。

https://www.python.org/dev/peps/pep-0008/#should-a-line-break-before-or-after-a-binary-operator

答案 2 :(得分:2)

FWIW,autopep8(带有--aggressive标志)从您的原始代码生成此内容:

my_var = somethinglikethis.where(
    we=do_things).where(
    we=domore).where(
    we=everdomore)

但我同意 - 巴斯蒂安的解决方案更优雅。

答案 3 :(得分:1)

做有用的。

另外,请查看有关Python中缩进神话的白皮书。可以找到 here

它始于:

  

“Whitespace在Python源代码中很重要。”

     

不,不是一般的。只有你的陈述的缩进级别   重要的(即你陈述最左边的空格)。   在其他地方,空白并不重要,可以像你一样使用   就像在任何其他语言中一样。您也可以插入空行   在任何地方都不包含任何内容(或只包含任意空格)。

我希望有所帮助。

答案 4 :(得分:-2)

那里确实没有任何错误的方法。你列出的所有内容都是一样的。