ChatGPT解决这个技术问题 Extra ChatGPT

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

鉴于:

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

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

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

0
0 _

线是什么?你可以在下一行有参数没有任何问题:

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

否则,您可以执行以下操作:

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

或显式换行:

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

查看 style guide 了解更多信息。

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

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

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

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

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


实际上,您对样式指南的偏好完全倒退。隐式延续是首选,显式反斜杠仅在必要时使用。
Carl:我不同意,这是来自指南:包装长行的首选方法是在括号、方括号和大括号内使用 Python 的隐含行延续。如有必要,您可以在表达式周围添加一对额外的括号,但有时使用反斜杠看起来更好。
样式指南引用的关键部分是“如有必要,您可以在表达式周围添加一对额外的括号,但有时使用反斜杠看起来更好。”风格指南并不是说你应该添加括号,而是让作者自己判断。
自从添加这些注释以来,大概 PEP-8 发生了变化,因为现在很清楚应该添加括号来包裹长行:“长行可以通过将表达式包裹在括号中来分隔多行。”
PEP8 确实在 2010 年发生了变化——“有时使用反斜杠看起来更好”已经消失了。
S
S.B

来自 PEP 8 -- Style Guide for Python Code

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

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

使用 open('/path/to/some/file/you/want/to/read') 作为 file_1,\ open('/path/to/some/file/being/written', 'w') 作为 file_2: file_2.write(file_1.read()) 另一种情况是断言语句。

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

矩形类(Blob):def __init__(self,width,height,color='black',强调=None,highlight=0):if(宽度== 0和高度== 0和颜色=='红色'和强调== 'strong' 或 highlight > 100): raise ValueError("sorry, you lost") if width == 0 and height == 0 and (color == 'red' or enhancement is None): raise ValueError("I不要这么认为——值是 %s, %s" % (width, height)) Blob.__init__(self, width, height, color,强调, highlight)file_2.write(file_1.read())

PEP8 现在推荐数学家及其出版商使用的相反约定(用于打破二元运算)以提高可读性。

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

PEP8: Should a line break before or after a binary operator?

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

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

# 是:容易将操作符与操作数匹配

income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

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

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


NB 建议在 2010 年更改:“长行可以被打破......通过将表达式包装在括号中。应该优先使用这些而不是使用反斜杠......”,并且所有反斜杠都从代码示例中删除。
@e100:阅读上面的粗体文本:The preferred way .. is by using Python's implied line continuation inside parenthesesby wrapping expressions in parentheses 相同。我已经更新了示例
但请注意,“有时使用反斜杠看起来更好”也已消失。
2015 年,样式指南更新为实际上更喜欢在 Donald Knuth 的研究之后打破 before 二元运算符,因为在可读性方面的感知改进。
T
Ted Pudlik

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

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


这是能够更好地看到尾随空格的原因之一。即 vim 中的 set list listchars=trail:· 之类的东西。 :)
这不仅适用于反斜杠后的空格。反斜杠应该是该行的最后一个字符。特别是,您不能通过用反斜杠换行并在其后添加评论来评论总和中的特定术语。括号工作正常! :)
遗憾的是,这种解释从文档中消失了(3.1 之后)。在 PEP8 中没有解释推理。
S
SCdF

在行尾放置 \ 或将语句括在括号 ( .. ) 中。从 IBM

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

或者

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

K
Konrad Rudolph

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

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

J
Jason Navarrete

从马的口中:显式行连接两个或多个物理行可以使用反斜杠字符(\)连接成逻辑行,如下所示:当物理行以不属于字符串文字或注释一部分的反斜杠结尾时,它是与以下内容连接形成单个逻辑行,删除反斜杠和以下行尾字符。例如:如果 1900 < 年 < 2100 并且 1 <= 月 <= 12 \ and 1 <= day <= 31 and 0 <= hour < 24 \ and 0 <= minute < 60 and 0 <= second < 60: #看起来像一个有效的日期返回 1 以反斜杠结尾的行不能带有注释。反斜杠不会继续评论。除字符串文字外,反斜杠不会继续标记(即,字符串文字以外的标记不能使用反斜杠跨物理行拆分)。反斜杠在字符串文字之外的其他地方是非法的。


-1,因为该示例是单一的 IMO。复合条件绝对可以有括号,这更实用(用于编辑或自动重新包装)和惯用。
j
jlaurens

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

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}"
)

B
Brandt

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

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

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

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


P
Peter Mortensen

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

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

加入列表不是必需的,并且具有性能开销。使用三引号字符串文字
C
Community

摘自 The Hitchhiker's Guide to Python (Line Continuation):

当逻辑代码行长于可接受的限制时,您需要将其拆分为多个物理行。如果行的最后一个字符是反斜杠,Python 解释器将连接连续的行。这在某些情况下很有用,但通常应该避免,因为它很脆弱:在反斜杠之后添加到行尾的空格会破坏代码并可能产生意想不到的结果。更好的解决方案是在元素周围使用括号。在行尾留下一个未闭合的括号,Python 解释器将加入下一行,直到括号闭合。同样的行为也适用于花括号和方括号。但是,通常情况下,必须拆分长逻辑行表明您正在尝试同时做太多事情,这可能会妨碍可读性。

话虽如此,下面是一个考虑多个导入的示例(当超过 line limits, defined on PEP-8 时),通常也适用于字符串:

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