3.5. フォーマット文字列

Python は値の文字列へのフォーマットをサポートしています. 非常に込み入った式も含むことはできますが, %s プレースホルダ (訳注. 値の代わりに仮に置かれる文字列) を使って文字列に値を挿入するという, 基本的な使い方がほとんどです.

Note
Python のフォーマット文字列では, Csprintf 関数と同じ文法が使われています.

Example 3.21. フォーマット文字列の紹介

>>> k = "uid"
>>> v = "sa"
>>> "%s=%s" % (k, v) 1
'uid=sa'
1 The whole expression evaluates to a string. 最初の %sk の値で置き換えられ, 2 番目の %sv の値で置き換えられます. 他の全ての文字 (この場合は等号) はそのまま残ります.

(k, v) がタプルであることに注意してください. 私は, タプルはとあることに役立つ, と言いました.

あなたは, ただ単に文字列の連結を行うのに大袈裟なやり方をしていると考えるかもしれませんが, それは正しいでしょう. しかし, フォーマット文字列は単なる文字列連結ではありません. 単なる書式化でもありません. それは同時に暗黙の型変換 (coercion) でもあるのです.

Example 3.22. フォーマット文字列と文字列連結

>>> uid = "sa"
>>> pwd = "secret"
>>> print pwd + " is not a good password for " + uid      1
secret is not a good password for sa
>>> print "%s is not a good password for %s" % (pwd, uid) 2
secret is not a good password for sa
>>> userCount = 6
>>> print "Users connected: %d" % (userCount, )           3 4
Users connected: 6
>>> print "Users connected: " + userCount                 5
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
1 + は文字列連結の演算子です.
2 この自明な場合では, フォーマット文字列の結果は文字列連結と同じになります.
3 (userCount, ) は 1 つの要素を持つタプルです. 文法が少々奇妙なのはそうなのだが, これにはタプルであることを明白にするという良い理由があります. 実際, リストやタプルや辞書を定義する際に, 常に最後の要素の後ろにカンマを付けることができますが, 1 つの要素を持つタプルを定義する際には, カンマは必須です. もしカンマが必須でなかったら, Python(userCount) が 1 つの要素を持つタプルなのか単なる userCount という値なのか判別できません.
4 フォーマット文字列は %s ではなく %d を使うことで整数を扱います.
5 文字列と非文字列を連結しようとすると例外が送出されます. フォーマット文字列と違って, 文字列連結は全てが文字列の場合にのみ行うことができます.

Cprintf についても言えることですが, Python のフォーマット文字列はスイスアーミーナイフのようなものです. それは豊富なオプションや, 多くの種類の値の特殊な書式化を行う修飾文字列を持っています.

Example 3.23. 整数の書式化

>>> print "Today's stock price: %f" % 50.4625   1
50.462500
>>> print "Today's stock price: %.2f" % 50.4625 2
50.46
>>> print "Change since yesterday: %+.2f" % 1.5 3
+1.50
1 フォーマット文字列のオプション %f は値を 10 進整数として扱い, 小数点以下 6 桁まで出力します.
2 %f オプションの ".2" 修飾子は, 値を小数点以下 2 桁に切り詰めます.
3 修飾子を混ぜることもできます. + 修飾子を加えると値の前にプラス記号またはマイナス記号が付きます. ".2" 修飾子も付いており, 小数点以下がちょうど 2 桁となるように 0 詰めされているということに注意してください.

フォーマット文字列についてさらに知るには