我怎样才能用Python把这一长行拆分?

2024-04-20 01:51:31 发布

您现在位置: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))

Tags: ininfoformaturlaslineourlogger
3条回答

就我个人而言,我不喜欢挂开放的积木,所以我会把它格式化为:

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

一般来说,我不会费心费力地使代码完全适合80列的行。把线的长度控制在合理的水平是值得的,但硬80限制已经成为过去。

编译器将连续的字符串文字连接起来,并将带圆括号的表达式视为一行代码:

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))

这是个开始。在使用长字符串的代码之外定义长字符串并不是一个坏习惯。这是一种分离数据和行为的方法。第一个选项是通过使字符串文本彼此相邻来隐式地将它们连接在一起:

("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的zen所说,显式优于隐式,但这会创建三个字符串,而不是一个字符串,并使用两倍的内存:有两个是您编写的,加上一个是它们结合在一起的两个字符串,因此您必须知道何时忽略zen。好处是您可以将格式应用于 每一行上的任何一个子串,或从括号外到整批的子串。

最后,可以使用三个带引号的字符串:

"""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."""

这与上面的相同技术有相同的问题,因为正确的代码与不正确的代码只有不可见的空白。

哪一个是“最好的”取决于你的特殊情况,但答案不是简单的审美,而是一个微妙的不同的行为。

相关问题 更多 >