我如何在Python中断开这一长行?
你会怎么处理这样一行很长的文本呢?我想把它的宽度控制在最多80个字符以内:
logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))
这样做是我最好的选择吗?
url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))
6 个回答
15
我个人不太喜欢那种悬空的代码块,所以我会把它格式化成这样:
logger.info(
'Skipping {0} because its thumbnail was already in our system as {1}.'
.format(line[indexes['url']], video.title)
)
一般来说,我不会太在意代码一定要严格控制在80个字符一行。保持每行的长度在合理范围内是有必要的,但死死地限制在80个字符已经过时了。
60
连续的字符串字面量会被编译器自动连接在一起,而用括号括起来的表达式会被视为一行代码:
logger.info("Skipping {0} because it's thumbnail was "
"already in our system as {1}.".format(line[indexes['url']],
video.title))
437
这算是一个开始。把长字符串定义在使用它们的代码之外,这其实是个不错的做法。这样可以把数据和行为分开。你可以通过把字符串放在一起,隐式地连接它们:
("This is the first line of my text, "
"which will be joined to a second.")
或者用换行符继续,这种方式稍微有点脆弱,因为这样是可以的:
"This is the first line of my text, " \
"which will be joined to a second."
但这样就不行了:
"This is the first line of my text, " \
"which will be joined to a second."
看出区别了吗?没有?那你在写代码的时候也不会注意到。
(第二个例子中,\
后面有一个空格。)
隐式连接的缺点是它只适用于字符串字面量,而不适用于从变量中获取的字符串,所以当你重构代码时,事情可能会变得复杂。此外,你只能对整个组合字符串进行格式化。
另外,你可以使用连接操作符(+
)来显式连接:
("This is the first line of my text, " +
"which will be joined to a second.")
显式比隐式要好,正如Python的哲学所说,但这样会创建三个字符串而不是一个,使用的内存也会翻倍:你写的两个字符串,加上它们连接在一起的那个,所以你得知道什么时候可以忽略这条哲学。好处是你可以对每一行的子字符串单独进行格式化,或者对整个字符串进行格式化。
最后,你可以使用三重引号字符串:
"""This is the first line of my text
which will be joined to a second."""
这通常是我最喜欢的方式,尽管它的行为稍微有点不同,因为换行符和后面行的任何前导空格都会出现在最终的字符串中。你可以用转义的反斜杠消除换行符。
"""This is the first line of my text \
which will be joined to a second."""
这和上面提到的技术有同样的问题,正确的代码和错误的代码只在不可见的空格上有所不同。
哪种方式是“最好”的,取决于你的具体情况,但答案不仅仅是美观的问题,而是行为上有细微的不同。