2012-06-22 151 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參考文檔。 –