プロンプトとコンテキスト
あなたのチームはPython 3.14にアップグレード中であり、テキストを結合する前に補間を検査したいと考えています。t-stringが何を生成するのか、それをどのように走査するのか、そしてなぜテンプレートAPIが自動エスケープではないのかを説明してください。
PEP 750はPython 3.14にテンプレート文字列を追加します。t"..."は直接strを生成するわけではありません。string.templatelib.Templateを生成し、静的セグメントと補間オブジェクトを保持するため、アプリケーションは結合する前に各値を検証、エスケープ、または変換できます。
面接官がテストしていること
f-stringの即時文字列化と構造化されたt-stringの違い、TemplateとInterpolationのフィールド、生の値とフォーマット指定子、コンテキスト固有のエスケープ、副作用の制御、および古いPythonバージョンとの互換性を網羅してください。
30秒の回答フレームワーク
「まず、t-stringはそれ自体で安全な出力ではないと述べることから始めます。これは静的セグメントと補間オブジェクトを保持するため、レンダラーが生の値、式テキスト、変換、およびフォーマット指定子を検査し、SQL、HTML、またはロギング固有のエンコーディングを適用できます。値の型を制限し、ネストされたテンプレート、フォーマット指定子、例外、古いバージョンのフォールバックをテストし、出力先で最終出力を再度検証します。」
ステップバイステップの詳細解説
ステップ1: f-stringsとt-stringsを対比する
f-stringは評価されてstrにフォーマットされるため、その中間構造は失われます。t-stringはtプレフィックスを使用し、Templateを生成します。静的テキストと補間はレンダラーがそれらを結合するまで分離されたままになります。
ステップ2: コアオブジェクトを理解する
テンプレートには文字列セグメントとInterpolationオブジェクトが含まれています。補間は、その値、式テキスト、変換マーカー、およびフォーマット指定子を記録し、ポリシーが出力元と出力先のコンテキストを考慮できるようにします。反復処理を行っても、結果がすでに安全であることを意味するわけではありません。
ステップ3: 最小限のプロセッサを作成する
次のプロセッサは構造の走査を示すだけです。実際のシステムには依然としてコンテキスト固有のエンコーディングが必要です。
from string.templatelib import Template
def render_plain(template: Template) -> str:
parts = []
for item in template:
if isinstance(item, str):
parts.append(item)
else:
parts.append(str(item.value))
return "".join(parts)
message = t"Hello, {name}!"str(item.value)はプレーンテキストの例にのみ適しています。SQL、HTML、Shell、およびログには、独自のパラメータ化またはエンコーディングAPIが必要です。
ステップ4: 変換とフォーマット指定子を処理する
補間には、!s、!r、またはフォーマット指定子が含まれる場合があります。レンダラーは変換が許可されているかどうかを決定し、変換された値を出力先コンテキスト用にエンコードする必要があります。reprはHTMLエスケープではなく、フォーマット指定子が型の許可リストをバイパスしてはなりません。
ステップ5: 副作用のある式を回避する
t-stringは依然として補間式を評価してInterpolationオブジェクトを作成します。プロセッサはサンドボックスではありません。信頼できないテンプレートは構築時点でリスクがあります。プラグインやユーザー入力に対しては、動的に実行される式ではなくデータプレースホルダーを受け入れます。
ステップ6: 出力コンテキストごとにポリシーを選択する
プレーンテキストには許可リストに登録された変換を使用できます。HTMLには監査済みのHTMLエスケーパーが必要です。SQLにはドライバーパラメータのバインディングが必要です。Shellは連結を避けて引数配列を使用する必要があります。構造化ログは1つの結合された行ではなくフィールドを保持する必要があります。Templateは構造を提供するものであり、これらのセキュリティ境界を提供するものではありません。
ステップ7: バージョンをサポートしAPIを検出する
Python 3.14はstring.templatelibを提供します。互換性レイヤーは、既存のテンプレートライブラリを選択するか、古いバージョンでは明示的にf-stringsにフォールバックする必要があります。そこでは補間構造を保持しているかのように装ってはなりません。起動時にランタイムバージョンを確認し、サポートされているすべてのインタプリタでCIを実行してください。
ステップ8: テストと監視
静的セグメント、ネストされたt-string、フォーマット指定子、例外、__format__の副作用、および大きなテンプレートをテストします。機密性の高い補間コンテンツをログに記録せずに、拒否された値の型とテンプレートソースを記録します。出力に対してコンテキスト固有のセキュリティ回帰テストを実行します。
トレードオフと境界
構造化処理 vs 単純な結合
境界で監査、ローカライズ、または複数の出力ターゲットが必要な場合、構造が役立ちます。使い捨てのプレーンテキストスクリプトはf-stringの方がシンプルです。すべての文字列をテンプレートパイプラインに通すのではなく、リスクと再利用性によって選択してください。
柔軟なフォーマット vs 予測可能な型
任意の__format__を許可することは表現力がありますが、副作用や型のドリフトを引き起こします。共有レンダラーは型、変換、およびフォーマット指定子を制限し、拒否された値に対して診断可能なエラーを返す必要があります。
テンプレートオブジェクト vs 最終文字列
Templateは制御された境界内で役立ちます。最終出力は、送信、保存、または実行する前に、出力先固有の検証が依然として必要です。これは、すでにエンコードされたセキュリティトークンではありません。
障害訓練と進化計画
HTMLエスケープがバイパスされる
マークアップを返すカスタム__str__を補間に与え、単純なstr変換が安全でないことを確認します。それをコンテキストエンコーディングに置き換え、悪意のある値の回帰テストを追加します。
フォーマット指定子が例外を発生させる
サポートされていない指定子と、__format__が例外を発生させるオブジェクトを使用します。プロセッサは部分的な出力を返す代わりに、補間を特定してレンダリングを拒否する必要があります。
古いインタプリタがモジュールを実行する
Python 3.13で同じモジュールを起動します。バージョンチェックにより、構文エラーを本番環境まで先送りするのではなく、明確なエラーを生成するか、明示的な互換性実装を選択する必要があります。
よくある間違いとフォローアップ
間違い1: t-stringsが自動的にエスケープされると思い込む
フォローアップ: それらは何を解決しますか?ポリシーが結合前に実行できるように構造を保持します。SQLとHTMLの安全性は依然として専用のAPIに属します。
間違い2: 補間式が決して実行されないと思い込む
フォローアップ: いつ評価されますか?t-stringの構築中に実行されるため、信頼できないテンプレートはこの構文によってサンドボックス化されるわけではありません。
間違い3: reprを安全なエンコーディングとして扱う
フォローアップ: なぜ安全ではないのですか?reprはデバッグ用の表現であり、HTML、SQL、Shell、またはログフィールドのエンコーディングルールを保証するものではありません。
拡張フォローアップと模範解答
t-stringsはすべてのf-stringを置き換えるべきですか?
いいえ。この構造は、結合する前に補間を検査または変換する境界でのみ役立ちます。通常のプレーンテキストはf-stringのままで構いません。
SQLレンダラーをどのように構築しますか?
SQL文字列を生成しないでください。静的セグメントと値をドライバーのプレースホルダーにマッピングし、ドライバーを介して値をバインドし、ステートメント構造を記述するためだけにテンプレートを使用します。
古いPythonバージョンをどのようにサポートしますか?
ランタイムを確認し、3.14ではstring.templatelibを使用し、古いバージョンでは既存の実装を使用するか明示的な非サポートエラーを使用します。同じセキュリティテストスイートでセマンティクスの違いを検証します。