コンテンツへスキップ

Python 3.14 新機能!テンプレート文字列で文字列処理をレベルアップ

Python 3.14: Mastering Template Strings for Dynamic Text Generation

Python 3.14の新機能!テンプレート文字列(t-string)って何?

言語には、文字列の中に変数の値を埋め込む便利な機能として、f-string(フォーマット済み文字列リテラル)というものがあります。これは、例えば「こんにちは、〇〇さん!」の〇〇の部分を、変数の値で置き換えることができる機能です。しかし、f-stringは単純に値を埋め込むだけで、埋め込む際に変数の種類を調べたり、特別な処理を加えたりすることが難しいという弱点がありました。

そこで登場したのが、Python 3.14で導入されたテンプレート文字列(t-string)です! t-stringは、f-stringと見た目は似ているのですが、その役割は大きく異なります。t-stringは、文字列と変数を別々の要素として扱い、それぞれの要素に対して個別の処理を行うことができるのです。

t-stringの基本的な使い方

t-stringは、f-stringと非常によく似ています。違うのは、文字列を定義する際に”f”の代わりに”t”を使うことだけです。

name = "田中"
template = t"こんにちは、{name}さん!"

もしこれがf-stringだった場合、print(template)と書くと、「こんにちは、田中さん!」と表示されます。しかし、t-stringの場合は、文字列はそのまま表示されません。代わりに、以下のようなPythonオブジェクトが表示されます。

Template(strings=('こんにちは、', 'さん!'), interpolations=(Interpolation('田中', 'name', None, ''),))

これは、t-stringが単なる文字列ではなく、文字列の要素と変数の要素を別々に保持していることを示しています。t-stringは、このオブジェクトを使って、後から自由に文字列を組み立てることができるのです。

t-stringで何ができるの?

t-stringの真価は、その柔軟性にあります。例えば、変数の値をすべて大文字に変換してから文字列に埋め込む、という処理を簡単に行うことができます。

from string.templatelib import Template, Interpolation

def t_upper(template: Template):
    output = []
    for item in template:
        if isinstance(item, Interpolation):
            output.append(str(item).upper())
        else:
            output.append(item)
    return "".join(output)

name = "tanaka"
template = t"こんにちは、{name}さん!"
result = t_upper(template)
print(result) # 出力:こんにちは、TANAKAさん!

この例では、t_upperという関数を定義し、t-string内の変数を大文字に変換しています。このように、t-stringを使うことで、文字列の生成処理を柔軟にカスタマイズできるのです。

上記のコードでは、string.templatelibというモジュールからTemplateInterpolationをインポートしています。これは、t-stringを扱うために必要な型情報を提供するもので、おまじないだと思って書いておけばOKです!

t-stringの応用例:HTMLサニタイズ

t-stringのより高度な応用例として、HTMLサニタイズ(HTMLに含まれる危険な要素を取り除く処理)があります。Webサイトでは、ユーザーが入力したテキストをそのまま表示すると、悪意のあるスクリプトが実行されてしまう可能性があります。HTMLサニタイズは、そのような攻撃を防ぐための重要な技術です。

from string.templatelib import Template, Interpolation
import urllib.parse
import html

def clean(input:Template):
    output = []
    inside_tag = False
    for item in input:
        if isinstance(item, Interpolation):
            escape = urllib.parse.quote if inside_tag else html.escape
            out_item = escape(str(item.value))
        else:
            for l in item:
                if l in (""):
                    inside_tag = not inside_tag
            out_item = item
        output.append(out_item)
    return "".join(output)

name="<script>alert('XSS')</script>"
print(clean(t'Hello, {name}'))

この例では、cleanという関数が、HTMLタグの中にある変数と、HTMLタグの外にある変数で、異なるエスケープ処理(特殊文字を安全な文字に置き換える処理)を行っています。HTMLタグの中にある変数は、URLエンコード(URLで使用できない文字を変換する処理)され、HTMLタグの外にある変数は、HTMLエスケープ(HTMLで特別な意味を持つ文字を変換する処理)されます。これによって、悪意のあるスクリプトが実行されるのを防ぐことができます。

URLエンコードは、例えばスペースを”%20″に変換したりする処理のことです。HTMLエスケープは、例えば”<"を"<"に変換したりする処理のことです。

t-stringのメリット

t-stringの最大のメリットは、文字列の生成と処理を分離できることです。同じt-stringを使って、異なる処理関数を適用することで、様々な形式の文字列を生成することができます。これは、f-stringでは実現できない柔軟性です。つまり、料理で例えるなら、t-stringは「素材」であり、処理関数は「調理法」のようなものです。同じ素材でも、調理法を変えれば、全く違う料理を作ることができますよね!

まとめと感想

Python 3.14で導入されたテンプレート文字列(t-string)は、文字列の生成処理をより柔軟に行うための強力なツールです。f-stringに比べて少し複雑ですが、その分、様々な応用が可能です。特に、HTMLサニタイズのようなセキュリティに関わる処理では、t-stringの柔軟性が大いに役立ちます。

個人的には、t-stringはまだ発展途上の技術だと感じています。今後、より使いやすいAPI(アプリケーション・プログラミング・インターフェース。ソフトウェアの部品同士をつなぐ接点のようなもの)が提供されれば、さらに普及するのではないかと期待しています。

この記事は、以下の元記事をもとに筆者の視点でまとめたものです:
How to use template strings in Python 3.14

関連投稿

タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です