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

时间:2008-09-09 23:45:30

标签: python syntax line-breaks long-lines

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

例如,添加一串字符串

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

并将其分为两行:

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

10 个答案:

答案 0 :(得分:1032)

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

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')

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

答案 1 :(得分:196)

来自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页

答案 2 :(得分:63)

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

有关详情,请参阅Python惯用语和反成语(适用于Python 2Python 3)。

答案 3 :(得分:21)

在行尾添加\或将语句括在parens ( .. )中。来自IBM

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

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

答案 4 :(得分:21)

您可以在括号和大括号之间划分线条。此外,您可以将反斜杠字符\附加到一行以明确区分它:

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

答案 5 :(得分:17)

  

从马的口中:Explicit line joining

     

可以是两条或更多条物理线   加入逻辑行使用   反斜杠字符(\),如下所示:   当物理线路以a结尾时   反斜杠不是字符串的一部分   文字或评论,它与之相结合   以下形成单一逻辑   行,删除反斜杠和   跟随行尾字符。对于   例如:

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
     

以反斜杠结尾的行不能   发表评论。反斜杠不会   继续评论。反斜杠确实如此   除了字符串,不要继续使用令牌   文字(即除了以外的代币)   字符串文字不能拆分   使用反斜杠的物理线)。一个   反斜杠在其他地方是非法的   字符串文字外的行。

答案 6 :(得分:5)

如果您因为长字面量的字符串而想换行,可以将该字符串分成几段:

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

答案 7 :(得分:2)

可能不是pythonic方式,但是我通常使用带有连接功能的列表来编写长字符串,例如SQL查询。

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

答案 8 :(得分:0)

摘自《 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
)

答案 9 :(得分:0)

一个人也可以多行中断方法(obj.method())的调用。

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

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

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