SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonの新機能を知ろう!

Python 3.14の新機能――再利用可能なテンプレート文字列や高効率な圧縮ライブラリを解説

Pythonの新機能を知ろう! 第6回

テンプレート文字列リテラル[3.14]

 Python 3.14では、テンプレート文字列リテラル(t-strings)の利用が可能になりました。

 t-stringsは、フォーマット済み文字列リテラル(f-strings)と同じように文字列リテラルの一部を変数や式で置き換える機能です(補間機能ともいいます)。こう説明すると、t-stringsが単なるf-stringsの置き換えのように見えてしまうのですが、用途は全く別物です。具体的な例を通じて見ていきましょう。

[NOTE]f-strings

 f-stringsはPython 3.6で導入され、Python 3.12で改良されたことについては、第4回で紹介しました。基本的な振る舞いはそちらを参照してください。

 t-stringsの使い方はf-stringsに似ていますが、「f」ではなく「t」を前置すること、補間結果はstr(文字列)ではなくTemplateオブジェクト(string.templatelibモジュール)となることです。以下のリストでそれを確かめられます。

リスト template-string.py
name = "Nao"
birth = 1900
t = t"{name} さんの誕生年は {birth} 年です。"
print(t)
	# Template(strings=('', ' さんの誕生年は ', ' 年です。'), interpolations=(Interpolation('Nao', 'name', None, ''), Interpolation(1900, 'birth', None, '')))

 Templateオブジェクトにより、文字列をはじめとする任意のオブジェクトを生成するなど、補間結果の扱いの自由度が格段に高まります。Templateオブジェクトの基本的な取り扱いを見るために、f-stringsと同じ結果を得るコードを以下のリストに示します。

リスト template-string.py
from string.templatelib import Interpolation
…略…
s = []
for part in t:
    if isinstance(part, Interpolation):	(1)
        s.append(str(part.value))
    else:	(2)
        s.append(part)
s = "".join(s)	(3)
print(s)	# Nao さんの誕生年は 1900 年です。

 Templateオブジェクトは、静的な文字列と補間オブジェクト(Interpolationオブジェクト)をリストとして持っているので、for文を使っての反復処理が可能です。(1)要素が補間オブジェクトである場合、(2)それ以外の場合で文字列の配列を生成し、(3)最終的に連結すれば文字列を取得できます。

 こういった用途ではf-stringsを使う方が簡単なので、わざわざt-stringsを使う意味はありません。基本的な処理方法として紹介しましたが、本来の用途としては補間オブジェクトの内容を精査したり整形したりして、最終的な結果を得るというものでしょう。用途としては、SQLやHTML、ターミナルコマンド、ログ出力などの生成が考えられます。

 たとえば以下のリストは、HTMLのタグに属性リストを埋め込んだテンプレートを、マークアップとして整形する例です。テンプレート文字列リテラルを受け取って、タグ名や属性名は小文字に変換し、属性値は二重引用符で囲む関数generate_tagを定義しています。

リスト generate_html.py
from string.templatelib import Interpolation

attributes = {'SRC': 'image.jpg', 'ALT': 'some image'}	(1)
template = t"IMG {attributes}"

# タグ生成のための関数
def generate_tag(template: Template) -> str:
    s = []
    # テンプレートから順に要素を走査
    for part in template:
        # 補間部分は属性として処理
        if isinstance(part, Interpolation):
            a = []
            for key, value in part.value.items():	(2)
                a.append(f'{str(key).lower()}="{value}"')
            s.append(' '.join(a))
        # 静的部分は要素名として処理
        else:
            s.append(part.lower())
    # 最後にタグとして組み立て
    return '<' + ''.join(s) + '>'

print(generate_tag(template))	# <img src="image.jpg" alt="some image">

 (1)のように辞書を埋め込んで、(2)でそれを順番に処理するといった、f-stringsでは不可能であったこともt-stringsだと柔軟に対応できます。

 このように、Templateオブジェクトを使うと、正規化したりエスケープ処理後の文字列でSQL文やDOMを生成することで、安全かつ効率的に埋め込み処理を記述できます。

Zstandardの標準サポート[3.14]

 Python 3.14では、圧縮フォーマットであるZstandard(Zstd)が、標準ライブラリでサポートされるようになりました。Metaによる開発で、高速で高効率であるのが特徴です。

 Zstandardは、従来も外部ライブラリで利用可能でしたが、標準ライブラリに組み込まれたことでzlibやbzip、bz2などと同様にシンプルなインタフェースで利用することができます。compression.zstdモジュールとして提供されます。

 以下のリストは、bz2とzlib、zstdで圧縮率を比較してみたものです。データが単純なので一般的な評価にはなっていないと思われますが、全く同じ方法で圧縮できることがわかります。

リスト zstd.py
from compression import bz2	(1)
from compression import zlib
from compression import zstd

original = b"0123456789abcdefghijklmnopqrstuvwxyz" * 50

compressed = bz2.compress(original)
ratio = len(compressed) / len(original)
print(f"圧縮率(bz2): {ratio}")	# 0.07222222222222222

compressed_zlib = zlib.compress(original)
ratio_zlib = len(compressed_zlib) / len(original)
print(f"圧縮率(zlib): {ratio_zlib}")	# 0.03333333333333333

compressed_zstd = zstd.compress(original)
ratio_zstd = len(compressed_zstd) / len(original)
print(f"圧縮率(zstd): {ratio_zstd}")	# 0.030555555555555555

 Python 3.14では、(1)のようにcompressionパッケージから新しい圧縮モジュールをインポートするように変更されました。ただし、「import bz2」のように従来の圧縮モジュールを直接インポートする記法も引き続き使用できます(zstdを除く)。なお、従来のモジュールは、5年以内に非推奨化および廃止されることになっています。

 結果を見ると、bz2が最も圧縮率が低く、zlib、zstdの順で圧縮率が向上していることが分かります。ただし、圧縮率は元データの性質で変化するので、あくまでも傾向です。

 ストレージサイズやネットワークの帯域は年々大きくなっているとはいえ、やり取りするデータは小さいに越したことはないので、データの保存ややり取りの効率化に貢献すると思われます。

次のページ
括弧なしのexcept/except*式を許可[3.14]

この記事は参考になりましたか?

Pythonの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22392 2025/10/23 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング