1266

我有一长行代码,我想在多行中分解。我用什么,语法是什么?

例如,添加一堆字符串,

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

并将其分为两行,如下所示:

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

10 回答 10

1425

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

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'

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

于 2008-09-09T23:52:05.643 回答
272

来自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)file_2.write(file_1.read())

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 页

于 2008-09-10T00:06:39.900 回答
81

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

有关更多信息,请参阅 Python Idioms 和 Anti-Idioms(适用于Python 2Python 3)。

于 2008-09-15T06:28:30.237 回答
33

\在行尾放置 a或将语句括在 parens 中( .. )。来自IBM

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

或者

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)
于 2008-09-09T23:48:30.740 回答
28

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

x = (tuples_first_value,
     second_value)
y = 1 + \
    2
于 2008-09-21T12:20:08.193 回答
24

从马的嘴里:显式线加入

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

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

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

于 2008-09-09T23:53:17.153 回答
14

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

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}"
)
于 2020-03-25T07:57:38.280 回答
7

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

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

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

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

于 2020-11-12T22:31:45.720 回答
6

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

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])
于 2018-11-02T11:22:00.137 回答
3

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

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

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

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

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

from app import (
    app, abort, make_response, redirect, render_template, request, session
)
于 2018-12-06T18:45:17.623 回答