2012-06-22 11 views
9

私は最近次のコードを見つけました。トリプルクォートの単一のインスタンスのために有効に見えませんが、うまくいくようです。誰でもここで何が起こっているのか説明できますか?Pythonの文字列の連結の混乱

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

答えて

9

すべての文字列が最初に連結されます。

""は空の文字列です。

次に、置換が行われる。

+1

+1 2分速い – Mualig

+2

誰もそのような混乱したコードを書くことはありませんでした。私はその質問の前提を拒否する! – Felix

+1

連結された文字列と最後の空の文字列の間に空白は必要なく、コード内のいくつかの場所で繰り返されます(疑わしいFelixのリンクを投稿することができます)。 –

1

複数の行に文字列を使用する場合は、"を追加して、文字列として1行の出力を最初に連結することができます。あなたは、コードを変更することができた場合は、文字列をフォーマットする%構文は時代遅れになってきていることに注意し、

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

:あなたは、ラインを読むことができます。それは複数行にまたがるする必要がある場合

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があるのPythonのバージョンがそれをサポートしている場合は、str.format()を使用する必要があります他の1つの文字列として解析されます:あなたの例では

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

、あなたは最後です(行の3つの文字列リテラルを持って""、空の文字列)が終了していて、三重引用符で始まっていない単一の複数行リテラルではなく、この方法で連結されています。

+0

+1を参照してください。 –