文字列

【Python】テンプレート文字列 t-string の使い方

【Python】テンプレート文字列 t-string の使い方
naoki-hn

Python のテンプレート文字列(t-string)の使い方の基本について解説します。

テンプレート文字列 t-string

テンプレート文字列 t-string とは

t-string とは、Python 3.14 で新しく追加されたテンプレート文字列のための構文です。t-string は、以下のような文字列のことで、文字列をフォーマットするための f-string とよく似ていますが、最大の特徴は式の内容を保持したまま、文字列としてはまだフォーマットされない点です。

t"Hello {name}"

上記のように書いても name の値は即時に文字列には変換されません。t-string は、完成した文字列を作るものではなく、後から評価・処理されることを前提としたテンプレートを生成するものです。

この記事では、テンプレート文字列 t-string の基本的な使い方や関連する型の構造などについて紹介します。

フォーマットのための f-string については「formatやf-stringを用いて文字列をフォーマットする方法」を参考にしてください。

注意点

t-string を使用するには、Python 3.14 以降である必要があるので注意してください。

なぜ t-string が必要になるのか

t-string は、PEP 750 で提案されて取り込まれた構文です。文字列フォーマットのための f-string は非常に便利な構文ですが「文字列が即時評価される」という性質があり、もともとどういった文字列の中に何が埋め込まれたのかが後からは分からないという特徴があります。

f-string は多くの場合で問題になりませんが、次のようなケースでは注意が必要です。

  • SQL や HTML に悪意のある文字列が取り込まれないように安全に処理したい。(SQL インジェクションやクロスサイトスクリプティング(XSS)の対策)
  • ユーザー入力を含む文字列をそのまま評価したくない。
  • ライブラリでテンプレートを引数で受け取り処理したい。

これまでは、上記には独自に対応する必要がありましたが、t-string は「文字列化されていないテンプレート」という概念を Python 標準の文法とし、この課題を解決するために導入されています。

t-string の基本的な使い方

基本的な使い方

t-string の基本構文は、文字列リテラルの前に「t」をつけるだけです。

def main():
    user = "太郎"
    age = 30

    # t-string の使い方 例
    template = t"User: {user}, Age: {age}"

    # t-string の内容を表示
    print(f"template = {template}")

if __name__ == "__main__":
    main()
【実行結果】
template = Template(strings=('User: ', ', Age: ', ''), interpolations=(Interpolation('太郎', 'user', None, ''), Interpolation(30, 'age', None, '')))

f-string と非常によく似ています。{} を使用してプレースホルダを記述し、用意した変数(例では、userage)を渡します。

返却値を template という変数に入れて表示してみていますが、Template 型になっているということが分かります。また、Template 型の中には、Interpolation 型というものも含まれることが分かります。これらの型については、後ほど説明していきます。

t-string は文字列に変換されない

t-string の使い方は、f-string と同様で非常に簡単ですが、上記の例のポイントとしては、t-string を用意した時点で中の式は自動的に文字列には変換されない点です。上記の例でいうと userage の値は取得されますが、文字列としては展開されません。

t-string は式と文字列部分を分離したまま保持します。つまり、「文字列を作る」ためではなく、「文字列の設計図を作る」構文と理解すると分かりやすいかと思います。

この性質により以下のようなメリットがあります。

  • 意図しないコードの実行を防ぎセキュリティ上のリスクを下げる実装をすることができる。
  • 評価タイミングを呼び出した側に委ねることができる。

このように、t-string は「安全に扱えるテンプレート」を実現できます。

t-string の型を深堀する

f-string は結果として str となりますが、t-string は単なる str ではありません。内部的には、テンプレートとしての構造を持ったオブジェクトが生成されます。

ここでは、その型構造について、以下の例を使いながら紹介していきます。

def main():
    user = "太郎"
    age = 30
    height = 1.72

    # t-string を作成
    template = t"User={user!r}, Age next year={age + 1}, Height={height:.2f}m"

    # t-string の内容を表示
    print(f"template = {template}\n")

    # strings, interpolations, values の内容を表示
    print(f"template.strings = {template.strings}\n")

    print("template.interpolations:")
    for i, interp in enumerate(template.interpolations):
        print(f"  [{i}]")
        print(f"    value        = {interp.value!r}")
        print(f"    expression   = {interp.expression!r}")
        print(f"    conversion   = {interp.conversion!r}")
        print(f"    format_spec  = {interp.format_spec!r}\n")

    print(f"template.values = {template.values}")

if __name__ == "__main__":
    main()

Template

t-string の返却は、Template 型となっています。具体的には、string.templatelib.Template です。Template は以下の構造を持ちます。

  • strings:テンプレート内の固定文字列部分のタプル
  • interpolationsstrings 要素間の補間データ(Interpolation)のタプル
  • values:式を評価した結果の値のタプル

例の出力結果では以下のようになります。

template.strings = ('User=', ', Age next year=', ', Height=', 'm')

template.interpolations:
  [0]
    value        = '太郎'
    expression   = 'user'
    conversion   = 'r'
    format_spec  = ''

  [1]
    value        = 31
    expression   = 'age + 1'
    conversion   = None
    format_spec  = ''

  [2]
    value        = 1.72
    expression   = 'height'
    conversion   = None
    format_spec  = '.2f'

template.values = ('太郎', 31, 1.72)

上記の結果を見てみると len(strings) == len(interpolations) + 1 という関係が成り立っているので、strings の要素の間に interpolations が挟まれている構造になっていることが分かるかと思います。また、values で各変数の部分にどのような値が埋め込まれるのかを確認できます。

Interpolation

interpolations の要素となっている Interpolation 型 についても要素を確認しておきましょう。具体的には、string.templatelib.Interpolation です。

  • value:式を評価した結果の値
  • expression:元の式を文字列として保持したもの
  • conversion:変換指定子(!r / !s / !a
  • format_spec:書式指定文字列(: 以降に記載)

value は式を評価した結果の値を確認できます。また、結果がどのような式により計算されたかについては expression で文字列として確認できます。これは、式レベルで妥当性を評価する際に使用できます。

変換指定子である conversion や書式指定文字列 format_spec は f-string でも指定できる要素です。t-string の特徴の通り、これらの変換はまだ適用されていません。テンプレートを受け取った側がどのような処理をするか判断をして使用します。

【変換指定子】

変換指定子は補間対象の値をどの文字列表現に変換するかを指定するための記法です。

  • !rrepr(value)
  • !sstr(value)
  • !aascii(value)

【書式指定文字列】

書式指定文字列は、数値や文字列の表示形式を細かく制御するための指定文字列です。以下は例になります。

  • .2f:小数点以下 2 桁
  • >10:右寄せ・桁数 10
  • 0=10:ゼロ埋め・桁数 10

t-string の使いどころ

t-string がテンプレートの構造を保持する構造であるということが分かったかと思います。f-string との使い分けを記載すると以下のようになります。

  • ”最終的な文字列がほしい” ⇒ f-string
  • “文字列化前に、値を安全に処理したい” ⇒ t-string

例えば、ユーザー入力に対して SQL 実行や HTML レンダリングをするような関数やメソッドを作成したとしましょう。この時、引数に str を受け取ると、その文字列に悪意のある文字列が含まれているかを判断するのは大変です。

このような際に、関数やメソッドの引数を t-string(Template 型)を受け取るような形式にしておけば、受け取った側で適切な処理をした上で文字列として活用することができ、SQL インジェクションや XSS の脆弱性に対策した処理をすることが可能です。

まとめ

Python のテンプレート文字列(t-string)の使い方の基本について解説しました。

t-string とは、Python 3.14 で新しく追加されたテンプレート文字列のための構文です。t-string は式と文字列部分を分離して保持し、まだ文字列として変換されていない構造を保持します。この性質により「意図しないコードの実行を防ぎセキュリティ上のリスクを防ぐ安全な処理を実装しやすい」「評価タイミングを呼び出した側に委ねることができる」といったメリットがあります。

t-string は、Template 型となっており、Interpolation 型を含むような構造になっており、その概要についても紹介しました。

t-string は、安全な関数やメソッドを構築する際に非常に便利なものであるため、うまく活用してみてほしいと思います。

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました