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)
这与上述相同的技术具有相同的问题,因为正确的代码仅通过不可见的空格与不正确的代码不同.
哪一个是"最好的"取决于你的具体情况,但答案不仅仅是审美,而是一种微妙的不同行为.
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级硬限制已成为过去.
您可以使用 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() 行为的其他详细信息,请参阅方法。