python の string.format とは
Python3 には sprintf
にあたる string.format
メソッドが存在しますが、 C言語風とは違っていて、テンプレートぽく使えて便利です。
context = {
'name': '太郎',
'point': 10,
}
print('[お知らせ] {name}から{point}ポイント送信されました'.format_map(context))
[お知らせ] 太郎から10ポイント送信されました
この方式だと、テンプレート文字列の中に {point}
が複数回出てきた場合などにも context
の定義を増やしたりしなくて良いので便利です。
python には string.Template
というクラスがあって、こいつも超簡易なテンプレートみたいな感じなんですが、帯に短し襷に長しみたいな感じで、ほとんどの使途を string.format
メソッドで置き換え可能です。
そして、最近は PHP をやっているので、これを PHP でも使いたいなというお話です。
PHP で Python の string.format 相当の処理
<?php
$context = [
'{name}' => '太郎',
'{point}' => 10,
];
echo strtr('[お知らせ] {name}から{point}ポイント送信されました', $context) . PHP_EOL;
[お知らせ] 太郎から10ポイント送信されました
ただの strtr
関数の使い方の説明になってしまっているので、しょぼい話ですが、 Python の string.format
の便利さから個人的に再発見したという感じで、便利やんと思ったので書きました。
補足
テンプレートとして、値を埋められない時に何も表示しないという振る舞いを一般的にきちんとしたテンプレートはするし、printf
的なフォーマットではプレースホルダの数が合わないとエラーになります。
個人的には何も表示しないというのは、間違いを見落としがちであまり好きではありませんが、一応同じ振る舞いには出来ます。Pythonも同じことです。
プレースホルダを表示しない
$context = [
'{name}' => '太郎',
];
$doc = strtr('[お知らせ] {name}から{point}ポイント送信されました', $context) . PHP_EOL;
echo preg_replace('/{[^}]+}/', '', $doc);
[お知らせ] 太郎からポイント送信されました
プレースホルダが一致しない場合は例外
<?php
$context = [
'{name}' => '太郎',
];
$doc = strtr('[お知らせ] {name}から{point}ポイント送信されました', $context) . PHP_EOL;
if (preg_match('/{[^}]+}/', $doc)) {
throw new Exception('Format error: Too few parameters');
}
echo $doc;
PHP Fatal error: Uncaught Exception: --