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

Ray*_*ega 979 python syntax line-breaks long-lines

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

例如,添加一串字符串,

e = 'a' + 'b' + 'c' + 'd'
Run Code Online (Sandbox Code Playgroud)

并将它分成两行:

e = 'a' + 'b' +
    'c' + 'd'
Run Code Online (Sandbox Code Playgroud)

Har*_*mbe 1110

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

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)
Run Code Online (Sandbox Code Playgroud)

否则你可以这样做:

if a == True and \
   b == False
Run Code Online (Sandbox Code Playgroud)

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

从您的示例行:

a = '1' + '2' + '3' + \
    '4' + '5'
Run Code Online (Sandbox Code Playgroud)

要么:

a = ('1' + '2' + '3' +
    '4' + '5')
Run Code Online (Sandbox Code Playgroud)

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

  • PEP8确实在2010年发生了变化 - "有时使用反斜杠看起来更好"已经消失了. (44认同)
  • 实际上,你的风格指南的偏好完全是向后的.隐式延续是首选,只有在必要时才使用显式反斜杠. (33认同)
  • Carl:我不同意,这是来自指南:包装长行的首选方法是在括号,括号和括号内使用Python隐含的行继续.如有必要,您可以在表达式周围添加一对额外的括号,但有时使用反斜杠看起来更好. (31认同)
  • 据推测,PEP-8自添加这些注释以来已经发生了变化,因为现在很明显应该添加括号来包装长行:"通过在括号中包装表达式,可以在多行中分解长行." (21认同)
  • 样式指南引用的关键部分是"如果有必要,可以在表达式周围添加一对额外的括号,但有时使用反斜杠看起来更好." 风格指南*不*说你应该*添加*括号,它留给作者的判断. (13认同)
  • @ e100 _"反斜杠有时候可能仍然合适."_现在是2014年.不知道如果它已经消失然后回来或者只是感动了. (9认同)
  • 带括号的版本的优点:您可以在换行符后添加注释.我经常使用多行语句将单个语句分成几部分并对每个部分进行评论.不能用反斜杠那个. (8认同)
  • Jerub:你不同意Carl,但你引用了指南,指出"首选方式......是通过在括号内使用Python的隐含线延续......".所以你要么不同意Harley,要么你失去了你粘贴的引用的含义. (2认同)
  • 问题是,在这种情况下需要_no_括号.当然,你可以拥有它们,但为什么你会把它们放在问题的例子中呢?无论哪种方式,我都会稍微编辑我的答案以澄清. (2认同)
  • 所以如果你链接你应该在你的断行链周围使用括号?我对来自 c、c++、c# 和 javascript 的 python 感到非常沮丧。它并不像我预期的那么简单,因为空格确实很重要,认为这是少即是多,但他们得到了我。 (2认同)

jfs*_*jfs 218

Python代码的样式指南:

包装长行的首选方法是在括号,括号和括号内使用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())
Run Code Online (Sandbox Code Playgroud)

另一个这样的情况是断言语句.

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

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)
Run Code Online (Sandbox Code Playgroud)

编辑: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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 但请注意,"有时使用反斜杠看起来更好"已经过去了. (10认同)
  • 在2015年风格指南更新后,实际上更喜欢在[Donald Knuth](https://mail.python.org/pipermail/python-dev/2016-April/144205.html)的研究之后打破**之前的**二元运营商由于可读性的改善. (5认同)
  • 注意,2010年的建议发生了变化:"可以通过在括号中包装表达式来打破长行.这些应该优先使用反斜杠...",并且从代码示例中删除了所有反斜杠. (3认同)
  • @e100:这里是[三个](http://stackoverflow.com/a/26435241/4279)[代码](http://stackoverflow.com/a/26399211/4279)[示例](http:// stackoverflow.com/a/26370717/4279) 其中反斜杠使代码更具可读性: [*"有时样式指南不适用。如有疑问,请使用您的最佳判断。"*](http://legacy.stackoverflow.com/a/26370717/4279) python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds) (2认同)

Geo*_*lly 70

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

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

  • 这是能够更好地看到尾随空白的一个原因; 即像vim中的`set list listchars = trail:·`.:) (7认同)

Kon*_*lph 23

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

x = (tuples_first_value,
     second_value)
y = 1 + \
    2
Run Code Online (Sandbox Code Playgroud)


SCd*_*CdF 22

\你的一行放在最后,或者把这个陈述括在parens中( .. ).来自IBM:

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))
Run Code Online (Sandbox Code Playgroud)

要么

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)
Run Code Online (Sandbox Code Playgroud)


Jas*_*ete 20

从马的嘴:明确的线加入

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • -1因为这个例子是单一的IMO.复合条件绝对可以包含括号,这更实用(用于编辑或自动重新打包)和惯用语. (7认同)

Bra*_*ndt 14

还可以将方法 () 的调用分成obj.method()多行。

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

> res = (some_object
         .apply(args)
         .filter()
         .values)
Run Code Online (Sandbox Code Playgroud)

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


jla*_*ens 10

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

long_string = "a very long string"
print("a very long string")
Run Code Online (Sandbox Code Playgroud)

将被替换

long_string = (
  "a "
  "very "
  "long "
  "string"
)
print(
  "a "
  "very "
  "long "
  "string"
)
Run Code Online (Sandbox Code Playgroud)

两个打印语句的输出:

a very long string

注意做作中的括号。

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

s = (
  '''2+2='''
  f"{2+2}"
)
Run Code Online (Sandbox Code Playgroud)


Har*_*gar 6

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

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

  • 加入列表不是必需的,并且会产生性能开销。使用三引号字符串文字 (2认同)