我如何在Python中断开这一长行?

237 投票
6 回答
323857 浏览
提问于 2025-04-15 17:59

你会怎么处理这样一行很长的文本呢?我想把它的宽度控制在最多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."""

这和上面提到的技术有同样的问题,正确的代码和错误的代码只在不可见的空格上有所不同。

哪种方式是“最好”的,取决于你的具体情况,但答案不仅仅是美观的问题,而是行为上有细微的不同。

撰写回答