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

我有一些这样的代码。中断应该发生在句点之前还是之后?

# 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)
48428 次浏览

做有用的事。

另外,看看这份关于 Python 中的 缩进的神话的白皮书,它可以在 译自: 美国《科学》杂志网站(http://www.secnetix.de: 80/olli/Python/block _ indentation.hawk)中找到。

开头是:

“空白在 Python 源代码中非常重要。”

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

希望能帮上忙。

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)

FWIW,Autopep8(带有 --aggressive标志)根据您的原始代码生成以下内容:

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

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