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

问题描述 投票:908回答:8

我有一长串代码,我希望在多行之间分解。我使用什么,语法是什么?

例如,添加一串字符串,

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

并将它分成两行:

e = 'a' + 'b' +
    'c' + 'd'
python syntax line-breaks long-lines
8个回答
1061
投票

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

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

否则你可以这样做:

if a == True and \
   b == False

查看style guide以获取更多信息。

从您的示例行:

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

要么:

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

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


202
投票

来自Style Guide for Python Code

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

反斜杠有时可能仍然合适。例如,long,多个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: Should a line break before or after a binary operator?

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页


65
投票

使用反斜杠结束一行的危险在于,如果在反斜杠之后添加空格(当然,很难看到),反斜杠就不再按照你的想法进行。

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


21
投票

\放在你的行的末尾或将声明括在parens ( .. )中。来自IBM

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

要么

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

21
投票

您可以在括号和大括号之间划分线条。此外,您可以将反斜杠字符qazxsw poi附加到一行以显式断开它:

\

18
投票

从马的嘴里:x = (tuples_first_value, second_value) y = 1 + \ 2

可以使用反斜杠字符(Explicit line joining )将两条或更多条物理线连接到逻辑行中,如下所示:当物理线以反斜杠结束时,该反斜杠不是字符串文字或注释的一部分,它与以下形成单个逻辑的逻辑线连接在一起line,删除反斜杠和后面的行尾字符。例如:

\

以反斜杠结尾的行不能发表评论。反斜杠不会继续发表评论。除了字符串文字之外,反斜杠不会继续使用令牌(即除了字符串文字之外的令牌不能使用反斜杠在物理行之间拆分)。反斜杠在字符串文字外的一行上的其他地方是非法的。


2
投票

可能不是pythonic方式,但我通常使用带有join函数的list来编写像SQL查询这样的长字符串。

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

1
投票

摘自The Hitchhiker的Python指南(query = " ".join([ 'SELECT * FROM "TableName"', 'WHERE "SomeColumn1"=VALUE', 'ORDER BY "SomeColumn2"', 'LIMIT 5;' ]) ):

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

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

但是,通常情况下,必须拆分一条较长的逻辑行表示您试图同时执行太多操作,这可能会妨碍可读性。

话虽如此,这是一个考虑多次导入(当超过Line Continuation时)的例子,也适用于一般的字符串:

line limits, defined on PEP-8
© www.soinside.com 2019 - 2024. All rights reserved.