## 2 テンプレート文字列

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

- "`$$`" はエスケープ文字です; "`$`" 一つに置換されます。

- "`$identifier`" は置換プレースホルダの指定で、 "identifier" というキーへの対応付けに相当します。デフォルトは、"identifier" の部分には Python の識別子が書かれていなければなりません。 "`$`" の後に識別子に使えない文字が出現すると、そこでプレースホルダ名の 指定が終わります。

- "`${identifier}`" は"`$identifier`" と同じです。 プレースホルダ名の後ろに識別子として使える文字列が続いていて、それを プレースホルダ名の一部として扱いたくない場合、例えば "${noun}ification" のような場合に必要な書き方です。

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

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

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

クラス `Template`( | template)

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

`substitute`( | mapping[, **kws])

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

`safe_substitute`( | mapping[, **kws])

  `substitute()` と同じですが、プレースホルダに対応するものを mapping や kws から見つけられなかった場合に、 `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` のサブクラスを導出して、 プレースホルダの書式、区切り文字、テンプレート文字列の解釈に 使われている正規表現全体をカスタマイズできます。 こうした作業には、以下のクラス属性をオーバライドします:

- delimiter - プレースホルダの開始を示すリテラル文字列 です。デフォルトの値は "`$`" です。実装系はこの文字列に対して 必要に応じて `re.escape()` を呼び出すので、正規表現を表す ような文字列にしては なりません。
- idpattern - 波括弧でくくらない形式のプレースホルダ の表記パターンを示す正規表現です (波括弧は自動的に適切な場所に追加 されます)。で尾フォルトの値は"`[_a-z][_a-z0-9]*`" という 正規表現です。

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

- escaped - このグループはエスケープシーケンス、すなわち デフォルトパターンにおける "`$$`" に対応します。
- named - このグループは波括弧でくくらないプレースホルダ名に 対応します; キャプチャグループに区切り文字を含めてはなりません。
- braced - このグループは波括弧でくくったプレースホルダ名に 対応します; キャプチャグループに区切り文字を含めてはなりません。
- invalid - このグループはそのほかの区切り文字のパターン (通常は区切り文字一つ) に対応し、正規表現の末尾に出現せねばなりません。