繁体   English   中英

如何在 Python 中进行换行(续行)?

[英]How can I do a line break (line continuation) in Python?

鉴于:

e = 'a' + 'b' + 'c' + 'd'

我如何将上面的内容写成两行?

e = 'a' + 'b' +
    'c' + 'd'

什么是线? 您可以在下一行使用参数而不会出现任何问题:

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

否则你可以做这样的事情:

if (a == True and
    b == False):

或显式换行:

if a == True and \
   b == False:

查看样式指南以获取更多信息。

使用括号,您的示例可以写成多行:

a = ('1' + '2' + '3' +
    '4' + '5')

使用显式换行可以获得相同的效果:

a = '1' + '2' + '3' + \
    '4' + '5'

请注意,样式指南说最好使用带括号的隐式延续,但在这种特殊情况下,仅在表达式周围添加括号可能是错误的方法。

来自PEP 8——Python 代码风格指南

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

反斜杠有时可能仍然合适。 例如,长的、多个 with 语句不能使用隐式延续,所以反斜杠是可以接受的:

 with open('/path/to/some/file/you/want/to/read') as file_1, \\ open('/path/to/some/file/being/written', 'w') as file_2: file_2.write(file_1.read())

另一种情况是断言语句。

确保适当缩进连续行。 打破二元运算符的首选位置是运算符之后,而不是在它之前。 一些例子:

 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)

PEP8 现在推荐数学家和他们的出版商使用的相反的约定(用于打破二进制操作)以提高可读性。

Donald Knuth二元运算符之前打破的风格垂直对齐运算符,从而在确定添加和减去哪些项目时减少眼睛的工作量。

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

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

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

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

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

[3]:Donald Knuth 的 The TeXBook,第 195 和 196 页

使用反斜杠结束一行的危险在于,如果在反斜杠后添加空格(这当然很难看到),反斜杠不再像你想象的那样。

有关更多信息,请参阅 Python 习语和反习语(适用于Python 2Python 3 )。

\\放在行的末尾或将语句括在括号( .. ) 来自IBM

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

或者

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)

您可以在括号和大括号之间换行。 此外,您可以将反斜杠字符\\附加到一行以显式断开它:

x = (tuples_first_value,
     second_value)
y = 1 + \
    2

来自马口:显式连线

可以使用反斜杠字符 ( \\ ) 将两个或多个物理行连接成逻辑行,如下所示:当物理行以不属于字符串文字或注释的一部分的反斜杠结尾时,它与以下内容连接形成单个逻辑行行,删除反斜杠和后面的行尾字符。 例如:

 if 1900 < year < 2100 and 1 <= month <= 12 \\ and 1 <= day <= 31 and 0 <= hour < 24 \\ and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date return 1

以反斜杠结尾的行不能带有注释。 反斜杠不会继续评论。 除字符串文字外,反斜杠不会继续标记(即,字符串文字以外的标记不能使用反斜杠跨物理行拆分)。 反斜杠在字符串文字之外的行上的其他地方是非法的。

如果您想因为文字字符串很长而中断您的行,您可以将该字符串分成几部分:

long_string = "a very long string"
print("a very long string")

将被替换

long_string = (
  "a "
  "very "
  "long "
  "string"
)
print(
  "a "
  "very "
  "long "
  "string"
)

两个打印语句的输出:

a very long string

注意做作中的括号。

另请注意,将文字字符串分成几部分允许仅在字符串的一部分上使用文字前缀并混合分隔符:

s = (
  '''2+2='''
  f"{2+2}"
)

它可能不是 Pythonic 的方式,但我通常使用带有 join 函数的列表来编写长字符串,例如 SQL 查询:

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])

还可以在多行中中断方法( obj.method() )的调用。

将命令括在括号“ () ”中并跨越多行:

> res = (some_object
         .apply(args)
         .filter()
         .values)

例如,我发现它在链调用 Pandas/Holoviews 对象方法上很有用。

摘自 The Hitchhiker's Guide to Python(行继续):

当逻辑代码行超过可接受的限制时,您需要将其拆分为多条物理行。 如果行的最后一个字符是反斜杠,Python 解释器将连接连续的行。 这在某些情况下很有用,但通常应该避免,因为它很脆弱:在行尾添加一个空格,在反斜杠之后,会破坏代码并可能产生意想不到的结果。

更好的解决方案是在元素周围使用括号。 在行尾留下一个未闭合的括号,Python 解释器将加入下一行,直到括号闭合。 大括号和方括号的行为相同。

但是,通常情况下,必须拆分很长的逻辑行表明您正在尝试同时做太多事情,这可能会影响可读性。

话虽如此,这里有一个考虑多重导入的例子(当超过 行限制时,定义在 PEP-8 上),也适用于一般的字符串:

from app import (
    app, abort, make_response, redirect, render_template, request, session
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM