2012-06-22 85 views
9

我最近遇到下面这段代码。它看起来不正确,因为三重引号的单个实例,但似乎工作正常。任何人都可以解释这里发生了什么?python字符串串联混淆

return ("Validation failed(%s): cannot calculate length " 
     "of %s.""" % (self.name, value))` 

回答

9

所有的字符串都先连在一起。

""是一个空字符串。

然后进行替换。

+1

+1 2min更快 – Mualig

+2

当然,没有人会写这样混淆的代码。我拒绝这个问题的前提! – Felix

+1

因此,连接的字符串和最终的空字符串之间不需要空白区域,在代码中的几个地方重复(我可以发布一个怀疑费利克斯的链接),这只是糟糕的编码。 –

1

当您在多行上使用字符串时,您可以添加"以创建单行输出,因为字符串会先连接。你可以阅读的路线为:

return ("Validation failed(%s): cannot calculate length " //1st line 
    "of %s." //2nd line 
    "" % (self.name, value)) //3rd line (empty) 
0

如果你可以修改代码,请注意%语法格式字符串变得过时。您应该使用str.format()如果你的Python版本支持:

return "Validation failed({0}): cannot calculate length of {1}.".format(self.name, value) 

如果需要跨越多行,使用:

return ("Validation failed({0}): " + 
     "cannot calculate length of {1}.".format(self.name, value)) 
+0

这应该是一个注释,因为它实际上并没有回答这个问题 - 同样,由于原始代码中完全相同的字符串连接,所以不需要“+”。 – lvc

4

这是Python的string literal concatenation - 本质上,字符串直接旁边显示每个其他被解析为一个字符串:

>>> 'foo' 'bar' 
'foobar' 

在你的榜样,你有三个字符串字面量在一排(最后是"",空字符串)以这种方式连接起来,而不是一个多行文字,该文字被终止但不是以三引号开头。

+0

+1参考文档。 –