我有一些像这样的代码。中断之前或之后是否应该发生?
# 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)
答案 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)
那里确实没有任何错误的方法。你列出的所有内容都是一样的。