4.1.2 テンプレート文字列

テンプレート (template) を使うと、PEP 292で解説されているように より簡潔に文字列置換 (string substitution) を行えるようになります。 通常の"%" ベースの置換に代わって、テンプレートでは以下のような 規則に従った"$"ベースの置換をサポートしています:

上記以外の書き方で文字列中に"$" を使うとValueError を送出します。

バージョン 2.4 で 新たに追加 された仕様です。

string モジュールでは、上記のような規則を実装した Template クラスを提供しています。 Template のメソッドを以下に示します:

クラス Template( template)
コンストラクタはテンプレート文字列になる引数を一つだけ取ります。

substitute( mapping[, **kws])
テンプレート置換を行い、新たな文字列を生成して返します。mapping は テンプレート中のプレースホルダに対応するキーを持つような任意の辞書類似 オブジェクトです。辞書を指定する代わりに、キーワード引数も指定でき、その 場合にはキーワードをプレースホルダ名に対応させます。 mappingkws の両方が指定され、内容が重複した場合には、 kws に指定したプレースホルダを優先します。

safe_substitute( mapping[, **kws])
substitute() と同じですが、プレースホルダに対応するものを mappingkws から見つけられなかった場合に、 KeyError 例外を送出する代わりにもとのプレースホルダが そのまま入ります。また、substitute()とは違い、規則外の 書き方で "$" を使った場合でも、ValueError を送出 せず単に "$" を返します。

その他の例外も発生しうる一方で、このメソッドが「安全 (safe)」 と呼ばれているのは、置換操作が常に例外を送出する代わりに利用可能な 文字列を返そうとしているからです。別の見方をすれば、 safe_substitute() は区切り間違いによるぶら下がり (dangling delimiter) や波括弧の非対応、Python の識別子として無効な プレースホルダ名を含むような不正なテンプレートを何も警告せずに 無視するため、安全とはいえないのです。

Template のインスタンスは、次のような public な属性を 提供しています:

template
コンストラクタの引数 template に渡されたオブジェクトです。通常、 この値を変更すべきではありませんが、読み込み専用アクセスを強制している わけではありません。

Templateの使い方の例を以下に示します:

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
[...]
ValueError: Invalid placeholder in string: line 1, col 10
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
[...]
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'

さらに進んだ使い方: Template のサブクラスを導出して、 プレースホルダの書式、区切り文字、テンプレート文字列の解釈に 使われている正規表現全体をカスタマイズできます。 こうした作業には、以下のクラス属性をオーバライドします:

他にも、クラス属性pattern をオーバライドして、正規表現パターン 全体を指定できます。オーバライドを行う場合、pattern の値は 4 つの名前つきキャプチャグループ (capturing group) を持った 正規表現オブジェクトでなければなりません。これらのキャプチャグループは、 上で説明した規則と、無効なプレースホルダに対する規則に対応しています:

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。