在Python中换行长字符串
在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 个回答
你可以使用下面的代码,在这里缩进(空格和换行)并不重要:
>>> def fun():
return ('{0} Here is a really long'
' sentence with {1}').format(3, 5)
你只需要把字符串放在括号里面就可以了。
使用相邻字符串字面量的连接,再加上格式化字符串字面量,是个不错的选择:
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))
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。