2010-01-13 32 views
103

你将如何去格式化这样的长线?我希望它不超过80个字符宽:我该如何分解Python中的这一长列?

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)) 
+1

看起来像一个不错的选择。你不喜欢它什么? – 2010-01-13 17:43:59

+2

有点主观,不是吗? :) – 2010-01-13 17:44:23

+1

相关:http://stackoverflow.com/questions/1940710/syntax-quirks-or-why-is-that-valid-python(在python中的字符串连接) – jldupont 2010-01-13 17:45:51

回答

213

这是一个开始。在使用它们的代码之外定义更长的字符串并不是一个坏习惯。这是分离数据和行为的一种方式。你的第一个选项是通过使它们相邻的隐含加入字符串字面在一起彼此:

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

明确优于隐式,为蟒蛇的禅宗说,但是这创造了三个字符串,而不是一个,并且使用两次尽可能多的记忆:有你写的两个,加上一个是两个连在一起,所以你必须知道什么时候忽略禅。好处是您可以在每行上分别应用格式化为 的任何子字符串,或者从括号外部向整个批次应用格式。

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

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

这具有同样的问题与上述相同的技术,在正确的代码仅由可见的空白字符不正确的代码不同。

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

+15

CPython编译器尽可能优化文字操作,这意味着添加两个字符串文字将导致字节码中只有一个字符串文字。 – 2010-01-13 18:03:52

+1

虽然我收到的所有答案都很有帮助,但您肯定可以帮助我理解打破字符串的所有方法。 “\”行结尾的问题是否后面有一个空格? – Gattster 2010-01-13 18:05:09

+0

我看不出这里有什么不同,但是,这主要是因为SO的原始语法着色。 (一些非常好的代码在SO上实际上是不可读的,但仅仅是因为它不是语言的语法非常接近于C)。让编辑讨厌拖拽尾随空格并不罕见,因为它们很少有用(或有意) 。 :-) – Ken 2010-01-13 18:13:27

27

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

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

我个人不喜欢开挂块,所以我格式化为:

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

一般来说,我不打算努力使代码完全适合80列的行。值得把线路长度降低到合理的水平,但80强的限制已成为过去。

+6

这不是过去的事情。 Python标准库仍然使用PEP8作为它的风格指南,所以规则依然存在,并且很多人(包括我自己)都遵循它。这是一个方便的地方画线。 – 2010-01-13 18:42:16

+2

我想知道有多少个项目仍然遵循80个字符规则。对于我使用的平均窗口大小,我认为100-120比80字节更有效。 – Gattster 2010-01-14 05:59:32

+1

是的,这是关于我使用的线路长度,虽然[恐怖! sacrilege!]我使用比例字体,所以确切的线条长度并不那么重要。更多的情况是单个行上的逻辑比多少个字符可读,例如,如果我有一长串的数据,没有人需要阅读,我很乐意让它溢出 – bobince 2010-01-14 12:41:48