Template

Python の version 2.4 から Template という仕組みが追加されている(stringモジュール内)。

Template とは以前からある %*1 による置き換えではなく、
辞書型(dict)のキー、もしくは辞書に類似した仕組みを要素として使った置き換えをする仕組みである。

プレースホルダ

Template の仕組みを使って置き換える対象となる文字列のことです。IDとも言います。
プレースホルダ名には以下のルールがあります。

  • プレースホルダ名の開始は"$"で示される。
  • 先頭文字は以下の何れかで構成されていること。
    • アンダースコア(_)
    • 英小文字*2
  • 2文字目以降の文字列は以下の何れかで構成されていること。
    • アンダースコア(_)
    • 英小文字
    • 数字
  • プレースホルダ名の終端は以下の何れかで判定する。
    • プレースホルダ名が {} で囲まれている場合は、} が終端を示す。
    • {} で囲まれていない場合、プレースホルダ名の構成ルールに当てはまらない文字の直前を終端とする。
プレースホルダ名 : 例
プレースホルダ 可否
$data
$sum_sold
$_name
$Sample
$/src/ ×
$(dst) ×


$name をIDとして使う場合

プレースホルダ + 文字列 可否
data$name
$name's book
$nametype ×
${name}type

substitute と safe_substitute

Template クラスでは substitute と safe_substitute という2つのメソッドを持つ。

Template_Instance.substitute( dictionary )
Template_Instance.safe_substitute( dictionary )

italic;">Template_Instance:Templateクラスのインスタンス
italic;">dictionary:プレースホルダ名をキーに持つ辞書型(もしくは辞書に類似した要素)


2つのメソッドの違いはプレースホルダを置き換えられなかった場合の動作の違いです。

プレースホルダを置き換えられない場合
substitute, safe_substitute の引数のデータ内にプレースホルダ名をキーに持つ要素が無い場合のこと。
  • substitute の場合、ValueError の例外を raise します。
  • safe_substitute の場合、プレースホルダ名がそのまま使用します。

サンプルコード

#!/usr/bin/env python
# coding: utf-8

import string;

tmp = string.Template( "I'm ${name}.  I'm from ${country}." );

print tmp.substitute( { 'name': 'NelNal', 'country': 'Tokyo' } );
print tmp.substitute( { 'name': 'Chan', 'country': 'China' } );
print tmp.substitute( name='Tom', country='America' );

*1:"print (This is %s) % 'pen'" の様な置き換え

*2:Templateクラスを使ってみた範囲では英大文字も使えるようだが