66

我有一些这样的代码。休息应该发生在经期之前还是之后?

# 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)
4

4 回答 4

108

PEP 8 建议使用括号,这样你就不需要了,并且温和地建议在二元运算符之前\而不是在它们之后中断。因此,格式化代码的首选方式是这样的:

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

两个相关的段落是来自最大线长度部分的一个:

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

...以及整个应该在二元运算符之前或之后换行吗?部分:

应该在二元运算符之前还是之后换行?

几十年来,推荐的风格是在二元运算符之后打破。但这会以两种方式损害可读性:运算符倾向于分散在屏幕上的不同列中,并且每个运算符都从其操作数移到上一行。在这里,眼睛必须做额外的工作来分辨哪些项目被添加,哪些被减去:

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

为了解决这个可读性问题,数学家和他们的出版商遵循相反的约定。Donald Knuth 在他的计算机和排版系列中解释了传统规则:“虽然段落中的公式总是在二元运算和关系之后中断,但显示的公式总是在二元运算之前中断”

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

# 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)
于 2011-10-30T00:42:11.843 回答
5

PEP 8 说在操作员之前中断是首选:

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

...

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

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

于 2016-05-09T11:54:42.507 回答
3

做有效的事。

另外,请查看这篇关于Python缩进神话的白皮书。可以在这里找到。

它开始于:

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

不,一般不会。只有语句的缩进级别很重要(即语句最左边的空格)。在其他任何地方,空格并不重要,可以随意使用,就像在任何其他语言中一样。您还可以在任何地方插入不包含任何内容(或仅包含任意空格)的空行。

我希望这会有所帮助。

于 2011-10-30T00:39:50.630 回答
2

FWIW,autopep8(带有--aggressive标志)从您的原始代码中生成了这个:

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

但我同意——Bastien 的解决方案更优雅。

于 2014-02-18T15:44:38.677 回答