我如何在Python中打破这条长线?

时间:2010-01-13 17:41:08

标签: python formatting code-formatting

你会如何格式化这样的长行?我希望它的宽度不超过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))

5 个答案:

答案 0 :(得分:273)

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

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

这与上述相同的技术存在同样的问题,因为正确的代码与不正确的代码只有不可见的空格。

哪一个是“最好的”取决于你的具体情况,但答案不仅仅是审美,而是一种微妙的不同行为。

答案 1 :(得分:34)

连续的字符串文字由编译器连接,带括号的表达式被认为是一行代码:

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

答案 2 :(得分:10)

我个人不喜欢悬挂打开的块,所以我将其格式化为:

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

总的来说,我不会费心去努力使代码完全适合80列的行。将线路长度降低到合理的水平是值得的,但80级的限制已成为过去。

答案 3 :(得分:3)

您可以使用textwrap模块将其分成多行

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))
  

ABCDEFGH
  IJKLIMNO

来自documentation

  

textwrap。换行(text [,width [,...]])
  包装文本中的单个段落(字符串),因此每行最多为宽度字符长。返回输出行列表,没有最终换行符。

     

可选关键字参数对应于TextWrapper的实例属性,如下所述。 width默认为70

     

有关wrap()行为的更多详细信息,请参阅TextWrapper.wrap()方法。

答案 4 :(得分:0)

对于同时尝试在长字符串上调用.format()并且在不中断后续.format(调用的情况下无法使用某些最受欢迎的字符串包装技术的任何人,您可以执行{{ 1}},而不是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))

否则,唯一的可能是使用行尾连续,我个人并不喜欢。