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

Gat*_*ter 160 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))
Run Code Online (Sandbox Code Playgroud)

这是我最好的选择吗?

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

jcd*_*yer 310

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

("This is the first line of my text, "
"which will be joined to a second.")
Run Code Online (Sandbox Code Playgroud)

或者使用行结束延续,这更加脆弱,因为这有效:

"This is the first line of my text, " \
"which will be joined to a second."
Run Code Online (Sandbox Code Playgroud)

但这不是:

"This is the first line of my text, " \ 
"which will be joined to a second."
Run Code Online (Sandbox Code Playgroud)

看到不同?没有?那么你也不会忘记你的代码.

隐式连接的缺点是它只适用于字符串文字,而不适用于从变量中获取的字符串,所以当你重构时,事情会变得更加毛茸茸.此外,您只能在组合字符串上整体插入格式.

或者,您可以使用连接运算符(+)显式连接:

("This is the first line of my text, " + 
"which will be joined to a second.")
Run Code Online (Sandbox Code Playgroud)

显式优于隐式,正如python所说的那样,但这会创建三个字符串而不是一个,并使用两倍的内存:有两个你写的,加上一个是两个连接在一起,所以你必须知道何时忽略禅.好处是你可以在每一行上分别对任何子字符串应用格式,或者从括号外部对整个批次应用格式.

最后,您可以使用三引号字符串:

"""This is the first line of my text
which will be joined to a second."""
Run Code Online (Sandbox Code Playgroud)

这通常是我最喜欢的,虽然它的行为略有不同,因为后续行中的换行符和任何前导空格都会显示在最终字符串中.您可以使用转义反斜杠消除换行符.

"""This is the first line of my text \
which will be joined to a second."""
Run Code Online (Sandbox Code Playgroud)

这与上述相同的技术具有相同的问题,因为正确的代码仅通过不可见的空格与不正确的代码不同.

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

  • CPython编译器尽可能地优化文字操作,这意味着添加两个字符串文字只会在字节码中产生一个字符串文字. (22认同)
  • 虽然我收到的所有答案都是有帮助的,但您的答案肯定可以帮助我理解分解字符串的所有方法。“ \”行结尾是否有空格是问题吗? (2认同)

Ign*_*ams 39

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

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


bob*_*nce 11

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

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

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

  • 这不是过去的事情.Python标准库仍然使用PEP8作为其样式指南,因此规则仍然存在,并且有很多人(包括我自己)遵循它.这是划线的便利场所. (7认同)
  • ~80个字符也可以更容易在同一屏幕上并排区分2个文件.此外,如果您在服务器控制台上的紧急情况期间调试某些内容,您将非常感谢80个字符的限制!:) (4认同)
  • 我想知道有多少项目仍然遵循80 char规则.对于我使用的平均窗口大小,我认为100-120对我来说比80个字符更有效率. (3认同)

Sau*_*abh 5

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

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))
Run Code Online (Sandbox Code Playgroud)

ABCDEFGH
IJKLIMNO

文档

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

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

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