在Python中,是否可以将长行拆分为多行?

686

和C语言一样���你可以将一行长代码分成多行。但是在Python中,如果我这样做,会出现缩进错误…… 这可行吗?


一个方法的调用(obj.method())也可以在多行中使用括号打断。https://dev59.com/0XVD5IYBdhLWcg3wNIvc#64812795 - Brandt
7个回答

763

来自PEP 8 - Python代码风格指南:

在Python中,推荐使用括号、方括号和花括号中的隐式行连续性来换行。如果需要,您可以在表达式周围添加额外的括号,但有时使用反斜杠更好看。请确保适当缩进延续的行。

隐式行连续性示例:

a = some_function(
    '1' + '2' + '3' - '4')

关于二元运算符周围的换行符,文中继续说道:

数十年来建议的风格是在二元运算符后面换行。 但这种方法有两种方式会影响可读性:运算符通常分散在屏幕上的不同列中,每个运算符都被移动到其操作数之外,并移到前一行。

在 Python 代码中,可以在二元运算符前后换行,只要局部遵守相应的约定即可。对于新代码,建议采用 Knuth 风格(在运算符 之前 换行)。

显式换行示例:

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

40
第二个例子中,它不喜欢在“\”后面出现(你看不到的)空格。 - cardamom
@cardamom 这个问题并不是 Python 特有的;例如,如果你尝试编写一个 shell 脚本,比如用 for 循环创建目录:for i in dir1\ (新行) dir2\ (新行) dir3\ (新行) ... mkdir $i 为了让这个脚本运行,反斜杠后面不能有空格。 - DavidC.
1
@cardamom 实际上它不喜欢任何字符(除了换行符)。对于注释来说太糟糕了... - Skippy le Grand Gourou

248

有多种方法可以做到这一点。

1). 一个冗长的陈述:

>>> def print_something():
         print 'This is a really long line,', \
               'but we can make it across multiple lines.'

2). 使用括号:

>>> def print_something():
        print ('Wow, this also works?',
               'I never knew!')

3). 再次使用\:

>>> x = 10
>>> if x == 10 or x > 0 or \
       x < 100:
       print 'True'

引用PEP8

在Python中,推荐使用括号、方括号和花括号的隐式换行来处理较长的代码行。如果需要的话,您可以在表达式周围添加一个额外的括号,但是有时使用反斜杠更好看。请确保正确缩进延续的代码行。对于二元运算符,首选断点是在运算符之后而不是之前。


这是在PyOhio的代码风格讨论中提出的,我们得出结论2)是一个不错的标准方式。虽然修改文本不太容易,但至少读起来还可以。 - Rick
@user225312,你能否使用'''代码换行更多代码''',或者这是一个不好的习惯? - onxx
第二个在Python 2.7中打印元组。 - iggy
第一个在IDLE(v.3.5)中给我SyntaxError,为什么?另外,如果我不以括号开头,则会出现缺少括号的相同错误。使用括号则没有任何反应。 - Yannis Dran
3
最后一句话提到在运算符 之后 进行换行,这与 PEP8 建议的在运算符 之前 进行换行以提高可读性相反。 - milpita
我不知道PEP8是否有所更改,但你引用的内容不存在,并且与PEP8的规定完全相反。对于新代码,PEP8建议在运算符之前换行。 - denshigomi

49

如果您想将一个长字符串赋值给变量,可以按照以下方法进行:

net_weights_pathname = (
    '/home/acgtyrant/BigDatas/'
    'model_configs/lenet_iter_10000.caffemodel')

不要添加任何逗号,否则你会得到一个包含多个字符串的元组!


11
这是因为Python会自动将圆括号内的字符串连接起来,无需使用加号(+)运算符。 - blueFast
对于字符串插值,需要在每个短字符串前加上 f f"/app/{self.product_name}/ranks?start_date={self.week_ago_str}&end_date={self.today_str}")``` - Charlie 木匠
如果您将所有字符串放在多行字符串中,即三个引号之间,例如("""line 1 line2"""),这也可以很好地工作,并且可能不会带来“逗号风险” :) - jmng

24

它在Python中也可以工作:

>>> 1+\
      2+\
3
6
>>> (1+
          2+
 3)
6

15

在尝试输入连续的文本(例如查询)时,请勿在行末加逗号,否则您将获得一个字符串列表而不是一个长字符串:

queryText= "SELECT * FROM TABLE1 AS T1"\
"JOIN TABLE2 AS T2 ON T1.SOMETHING = T2.SOMETHING"\
"JOIN TABLE3 AS T3 ON T3.SOMETHING = T2.SOMETHING"\
"WHERE SOMETHING BETWEEN <WHATEVER> AND <WHATEVER ELSE>"\
"ORDER BY WHATEVERS DESC"

有一个像这样的评论。

来自acgtyrant的评论,抱歉,之前没有看到。:/


2
这样不行 - 你需要在每个引用字符串的开头或结尾添加一些空格。目前在"T1"和"JOIN"之间没有空格。在上面的示例中,只需使用带有'''"""的多行字符串,SQL不会介意CR / LF。 - dsz

11

使用一对三引号将 DB 相关的代码分成多行写,这样看起来更加清晰易读:

SQL = """SELECT
            id, 
            fld_1, 
            fld_2, 
            fld_3, 
            ...... 
         FROM some_tbl"""

比下面这条巨长的线更好:

SQL = "SELECT id, fld_1, fld_2, fld_3, .................................... FROM some_tbl"

2
这只是一个权宜之计,但使用文档字符串作为普通字符串编码并不符合Pythonic的编程方式。 - Mohammad ElNesr
9
@Mohammad 这只是一个普通的三引号字符串,不是一个文档字符串 - wjandrea
这将导致在每行末尾添加一个新的换行符\n,而不是继续上一行。例如"'SELECT\nid,\nfld_1\nFROM some_tbl\n'"。 - liviaerxin

9
据我所知,这是可以实现的。Python对三重引号字符串("""like this""")内的括号、方括号和字符串有隐式的行延续,而延续行的缩进并不重要。如果您需要更多信息,建议阅读来自python.org的关于词法分析的这篇文章

3
只有三引号字符串才会隐式换行,这就是三引号和单引号之间的区别。 - Ned Batchelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接