Topik wawancara representatif

Wawancara coding: Bagaimana Anda membangun pemroses t-string Python 3.14 yang aman?

CodingSulit
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

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.

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:

python
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.

Sumber publik

Pertanyaan terkait

Alat wawancara terkait

Gunakan Tangkapan Layar untuk perintah coding

Ambil tangkapan layar soal, lalu telusuri batasan, solusi, kode, edge case, dan kompleksitas secara berurutan.

Lihat alat