在Python中换行长字符串

241 投票
6 回答
287012 浏览
提问于 2025-04-16 01:54

在Python中,如何在不影响缩进的情况下换行长代码行?

举个例子:

def fun():
    print '{0} Here is a really long sentence with {1}'.format(3, 5)

假设这段代码超过了推荐的79个字符限制。按照我的理解,缩进可以这样处理:

def fun():
    print '{0} Here is a really long \
sentence with {1}'.format(3, 5)

不过,这种方法会导致续行的缩进和fun()的缩进对齐。这样看起来就不太美观。如果有人查看我的代码,看到因为这个print语句而导致的不均匀缩进,可能会觉得很糟糕。

那么,有什么好的方法可以有效地缩进这些行,同时又不影响代码的可读性呢?

6 个回答

23

你可以使用下面的代码,在这里缩进(空格和换行)并不重要:

>>> def fun():
        return ('{0} Here is a really long'
        ' sentence with {1}').format(3, 5)

你只需要把字符串放在括号里面就可以了。

87

使用相邻字符串字面量的连接,再加上格式化字符串字面量,是个不错的选择:

x = 2
sep = 2 * '\n'
print(
    'This message is so long that it requires '
    f'more than {x} lines.{sep}'
    'And more lines may be needed.')

这种方法符合PEP 8的规范,并且能更好地利用空间。

不需要使用+运算符,也不需要用反斜杠来换行,没有不规则的缩进,也不需要担心用+=来累加字符串变量时可能出现的错误(比如不小心写成=,这样会导致静默错误),也没有多余的括号挂在print下面(参数会在自己的缩进层级中,而下一个元素会在print的缩进层级中)。

把字符串放在print(那行下面,可以减少缩进,让代码更易读。可读性来自于print(单独占一行,以及连续语句的统一对齐。

这种方法在抛出异常时,缩进的减少更为明显:

raise ModuleNotFoundError(
    'aaaaaaaaaaaaaaaaaaaaaaaa'
    'aaaaaaaaaaaaaaaaaaaaaaaa'
    f'aaaaa {x} aaaaa')

关于格式化字符串字面量(以“f”开头,比如f'...'),原始字符串也可以是格式化字符串字面量,通过结合“r”和“f”前缀:

rf'This is a formatted raw string, {sep}here is a backslash \.'

注意,原始字符串是为了在不写\\的情况下包含字面量反斜杠。如果不这样做,在未来的CPython版本中,会抛出SyntaxError错误。从Python 3.9开始,会发出DeprecationWarning警告:

python -X dev -c '"\q"'

输出结果:

<string>:1: DeprecationWarning: invalid escape sequence \q

这些替换非常易读。特别是,这种方法让编写生成代码或数学公式的代码变得非常愉快。

很少情况下,str.format方法可能适用,具体取决于需要什么样的替换。可以这样使用:

print((
    'This message is so long that it requires '
    'more than {x} lines.{sep}'
    'And more lines may be needed.'
    ).format(x=x, sep=sep))
319
def fun():
    print(('{0} Here is a really long '
           'sentence with {1}').format(3, 5))

相邻的字符串字面量在编译时会自动连接,就像在C语言中一样。想了解更多信息,可以查看这个链接:http://docs.python.org/reference/lexical_analysis.html#string-literal-concatenation

撰写回答