テンプレート文字列リテラル[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モジュール)となることです。以下のリストでそれを確かめられます。
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と同じ結果を得るコードを以下のリストに示します。
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を定義しています。
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で圧縮率を比較してみたものです。データが単純なので一般的な評価にはなっていないと思われますが、全く同じ方法で圧縮できることがわかります。
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の順で圧縮率が向上していることが分かります。ただし、圧縮率は元データの性質で変化するので、あくまでも傾向です。
ストレージサイズやネットワークの帯域は年々大きくなっているとはいえ、やり取りするデータは小さいに越したことはないので、データの保存ややり取りの効率化に貢献すると思われます。