问题:如何在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))
回答 0
那是一个开始。在使用长字符串的代码之外定义较长的字符串并不是一个坏习惯。这是分离数据和行为的一种方式。您的第一个选择是通过使字符串文字彼此相邻来隐式地将它们连接在一起:
("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.")
正如zen 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."""
这具有与上述相同技术相同的问题,因为正确的代码与不正确的代码的区别仅在于不可见的空格。
哪一个“最佳”取决于您的特定情况,但答案不只是简单的美学,而是微妙的不同行为之一。
回答 1
连续字符串文字由编译器连接,带括号的表达式被视为单行代码:
logger.info("Skipping {0} because it's thumbnail was "
"already in our system as {1}.".format(line[indexes['url']],
video.title))
回答 2
我个人不喜欢挂空块,所以我将其格式化为:
logger.info(
'Skipping {0} because its thumbnail was already in our system as {1}.'
.format(line[indexes['url']], video.title)
)
通常,我不会太费力地使代码完全适合80列行。可以将线长降低到合理的水平,但是硬80的限制已成过去。
回答 3
您可以使用textwrap模块将其分成多行
import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))
ABCDEFGH
IJKLIMNO
从文档中:
文本换行。wrap(text [,width [,…]])
将单个段落包装在文本(字符串)中,因此每一行最多为宽度字符。返回输出行列表,不带最终换行符。可选的关键字参数与的实例属性相对应
TextWrapper
,如下所述。宽度默认为70
。有关
TextWrapper.wrap()
wrap()行为的更多详细信息,请参见方法。
回答 4
对于也尝试调用.format()
长字符串并且在不中断后续.format(
调用的情况下无法使用某些最受欢迎的字符串包装技术的任何人,您可以使用str.format("", 1, 2)
代替"".format(1, 2)
。这使您可以使用任何喜欢的技术来断开字符串。例如:
logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))
可
logger.info(str.format(("Skipping {0} because its thumbnail was already"
+ "in our system as {1}"), line[indexes['url']], video.title))
否则,唯一的可能性就是使用行尾延续,我个人并不喜欢。