Perintah dan konteks
Tim Anda sedang meningkatkan ke Python 3.14 dan ingin memeriksa interpolasi sebelum menggabungkan teks. Jelaskan apa yang dihasilkan oleh t-string, cara menelusurinya, dan mengapa API template bukan merupakan pelolosan (escaping) otomatis.
PEP 750 menambahkan template string ke Python 3.14. t"..." tidak secara langsung menghasilkan str; ini menghasilkan string.templatelib.Template, mempertahankan segmen statis dan objek interpolasi sehingga aplikasi dapat memvalidasi, meloloskan (escape), atau mengubah setiap nilai sebelum digabungkan.
Apa yang sedang diuji oleh pewawancara
Mencakup perbedaan antara pengubahan langsung ke string pada f-string dan t-string yang terstruktur, bidang dari Template dan Interpolation, nilai mentah dan spesifikasi format, pelolosan khusus konteks, kontrol efek samping, dan kompatibilitas dengan versi Python yang lebih lama.
Kerangka jawaban 30 detik
"Saya akan mulai dengan mengatakan bahwa t-string bukanlah output yang aman dengan sendirinya. T-string mempertahankan segmen statis dan objek interpolasi sehingga perender dapat memeriksa nilai mentah, teks ekspresi, konversi, dan spesifikasi format, kemudian menerapkan pengkodean khusus untuk SQL, HTML, atau logging. Saya akan membatasi tipe nilai, menguji template bertingkat, spesifikasi format, pengecualian, dan fallback versi lama, serta memvalidasi output akhir lagi di tujuannya."
Pembahasan mendalam langkah demi langkah
Langkah 1: Bandingkan f-string dan t-string
F-string mengevaluasi dan memformat menjadi str, sehingga struktur perantara hilang. T-string menggunakan awalan t dan menghasilkan Template; teks statis dan interpolasi tetap terpisah sampai perender menggabungkannya.
Langkah 2: Pahami objek inti
Sebuah template berisi segmen string dan objek Interpolation. Sebuah interpolasi mencatat nilainya, teks ekspresi, penanda konversi, dan spesifikasi format, yang memungkinkan kebijakan mempertimbangkan konteks sumber dan tujuan. Iterasi tidak berarti hasilnya sudah aman.
Langkah 3: Tulis pemroses minimal
Pemroses berikut hanya menunjukkan penelusuran struktural; sistem nyata masih memerlukan pengkodean khusus konteks:
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) hanya cocok untuk contoh teks biasa. SQL, HTML, Shell, dan log memerlukan API parameterisasi atau pengkodean tersendiri.
Langkah 4: Tangani konversi dan spesifikasi format
Sebuah interpolasi dapat membawa !s, !r, atau spesifikasi format. Perender harus memutuskan apakah konversi diizinkan, lalu mengkodekan nilai yang dikonversi untuk konteks tujuan. repr bukan pelolosan HTML, dan spesifikasi format tidak boleh melewati daftar izin tipe.
Langkah 5: Hindari ekspresi dengan efek samping
T-string masih mengevaluasi ekspresi interpolasi untuk membuat objek Interpolation. Pemroses bukanlah sebuah sandbox; template yang tidak tepercaya sudah berisiko pada saat pembuatan. Untuk plugin atau input pengguna, terima placeholder data daripada ekspresi yang dieksekusi secara dinamis.
Langkah 6: Pilih kebijakan berdasarkan konteks output
Teks biasa dapat menggunakan konversi yang masuk dalam daftar izin; HTML memerlukan perolos HTML yang diaudit; SQL memerlukan pengikatan parameter driver; Shell harus menghindari penggabungan string dan menggunakan larik argumen; log terstruktur harus membawa bidang-bidang alih-alih satu baris yang digabungkan. Template menyediakan struktur, bukan batasan keamanan ini.
Langkah 7: Dukung versi dan temukan API
Python 3.14 menyediakan string.templatelib. Lapisan kompatibilitas harus memilih pustaka template yang sudah ada atau secara eksplisit beralih ke f-string pada versi yang lebih lama; ia tidak boleh berpura-pura mempertahankan struktur interpolasi di sana. Periksa versi runtime saat startup dan jalankan CI pada setiap interpreter yang didukung.
Langkah 8: Uji dan amati
Uji segmen statis, t-string bertingkat, spesifikasi format, pengecualian, efek samping __format__, dan template berukuran besar. Catat tipe nilai dan sumber template yang ditolak tanpa mencatat konten interpolasi sensitif; jalankan regresi keamanan khusus konteks pada output.
Pertukaran (trade-offs) dan batasan
Pemrosesan terstruktur versus penggabungan sederhana
Struktur membantu ketika suatu batasan memerlukan audit, lokalisasi, atau beberapa target output. Skrip teks biasa sekali pakai lebih sederhana menggunakan f-string. Pilih berdasarkan risiko dan penggunaan kembali daripada melewatkan setiap string melalui alur kerja template.
Pemformatan fleksibel versus tipe yang dapat diprediksi
Mengizinkan __format__ sembarang bersifat ekspresif tetapi menimbulkan efek samping dan pergeseran tipe. Perender bersama harus membatasi tipe, konversi, dan spesifikasi format, serta mengembalikan error yang dapat didiagnosis untuk nilai yang ditolak.
Objek template versus string akhir
Template berguna di dalam batasan yang terkontrol. Output akhir masih memerlukan validasi khusus tujuan sebelum mengirim, menyimpan, atau mengeksekusinya; ini bukan token keamanan yang sudah dikodekan.
Latihan kegagalan dan rencana evolusi
Pelolosan HTML dilewati
Beri interpolasi __str__ kustom yang mengembalikan markup dan verifikasi bahwa konversi str biasa tidak aman. Ganti dengan pengkodean konteks dan tambahkan regresi nilai berbahaya.
Spesifikasi format memunculkan pengecualian
Gunakan spesifikasi yang tidak didukung dan objek yang __format__-nya memunculkan pengecualian. Pemroses harus mengidentifikasi interpolasi dan menolak perenderan alih-alih mengembalikan output parsial.
Interpreter lama menjalankan modul
Jalankan modul yang sama pada Python 3.13. Pemeriksaan versi harus menghasilkan error yang jelas atau memilih implementasi kompatibilitas yang eksplisit daripada menunda kegagalan sintaksis hingga ke produksi.
Kesalahan umum dan tindak lanjut
Kesalahan 1: Mengasumsikan t-string melakukan pelolosan secara otomatis
Tindak lanjut: Masalah apa yang mereka selesaikan? Mereka mempertahankan struktur sehingga kebijakan dapat berjalan sebelum penggabungan; keamanan SQL dan HTML tetap menjadi tugas API khusus.
Kesalahan 2: Mengasumsikan ekspresi interpolasi tidak pernah berjalan
Tindak lanjut: Kapan ekspresi tersebut dievaluasi? Mereka berjalan saat membangun t-string, jadi template yang tidak tepercaya tidak mendapatkan sandbox dari sintaks ini.
Kesalahan 3: Memperlakukan repr sebagai pengkodean yang aman
Tindak lanjut: Mengapa tidak? repr adalah representasi debugging dan tidak menjamin aturan pengkodean HTML, SQL, Shell, atau bidang log.
Tindak lanjut lanjutan dan contoh jawaban model
Haruskah t-string menggantikan setiap f-string?
Tidak. Struktur hanya berguna pada batasan yang memeriksa atau mengubah interpolasi sebelum digabungkan; teks biasa biasa dapat tetap menggunakan f-string.
Bagaimana Anda membangun perender SQL?
Jangan menghasilkan string SQL. Petakan segmen statis dan nilai ke placeholder driver, ikat nilai melalui driver, dan gunakan template hanya untuk mendeskripsikan struktur pernyataan.
Bagaimana Anda mendukung versi Python yang lebih lama?
Periksa runtime, gunakan string.templatelib pada 3.14, dan gunakan implementasi yang ada atau error tidak didukung yang eksplisit pada versi yang lebih lama. Verifikasi perbedaan semantik dengan rangkaian pengujian keamanan yang sama.