PEP 750 – String templat (t-strings) disetujui
(peps.python.org)- PEP 750 memperkenalkan literal string baru di Python, yaitu string templat (
t"...") - Sebagai bentuk generalisasi dari f-string, ini menghasilkan tipe
Templateyang memungkinkan pemrosesan gabungan string dan nilai interpolasi sebelum dirender - Berguna untuk templat web, pemeriksaan keamanan, DSL (Domain-Specific Language), dan lainnya
Hubungan dengan PEP lain
- f-string diperkenalkan melalui PEP 498, dan sintaksnya diperluas di PEP 701
- PEP 501 sempat mengusulkan string templat umum (
i-string), tetapi ditunda - PEP 750 saat ini merupakan bentuk yang disederhanakan dan digeneralisasi dari PEP 501, dikembangkan berdasarkan ide yang sudah ada
Motivasi dan kebutuhan
- f-string memang sederhana, tetapi tidak bisa memproses nilai interpolasi sebelumnya, sehingga berpotensi menimbulkan masalah keamanan
- Ada kekhawatiran memicu celah keamanan seperti SQL injection dan serangan XSS
- Dengan string templat, nilai interpolasi bisa diproses lebih dulu agar aman digunakan
Contoh:
evil = "<script>alert('evil')</script>"template = t"<p>{evil}</p>"assert html(template) == "<p><script>alert('evil')</script></p>"
Spesifikasi string templat
Literal string templat
- Didefinisikan dengan prefiks
tatauT - Dievaluasi sebagai tipe
string.templatelib.Template - Mendukung sintaks mirip f-string, termasuk nested
- Bisa digabung dengan prefiks
r(rt,tr) - Tidak bisa digabung dengan prefiks
uataub - f-string dan string templat tidak dapat dipakai campuran
Tipe Template
- Merupakan tipe immutable dan memiliki properti berikut:
strings: tuple potongan stringinterpolations: tuple objek nilai interpolasivalues: tuple nilai dari interpolasi__iter__(): iterator yang mengembalikan string dan nilai interpolasi secara berurutan
Tipe Interpolation
value: hasil yang sudah dievaluasiexpression: string ekspresi interpolasi asliconversion: cara konversi (r,s,a, atau None)format_spec: string format
Contoh:
name = "World"template = t"Hello {name!r}"assert template.interpolations[0].conversion == "r"
Penanda debug =
t"{value=}"ditafsirkan sebagait"value={value!r}"- Spasi juga dipertahankan apa adanya (
t"{value = }"→"value = {value!r}")
Penggabungan string templat
- Operator
+dapat digunakan untuk menggabungkanTemplatedenganstr, atauTemplatedenganTemplate - Hasil penggabungan selalu bertipe
Template - Penggabungan string implisit (
t"Hello " t"World") juga dimungkinkan
Cara memproses string templat
Contoh: fungsi pemrosesan huruf besar
def lower_upper(template):parts = []for s in template:if isinstance(s, str): parts.append(s.lower())else: parts.append(str(s.value).upper())
return "".join(parts)
Contoh: implementasi pemrosesan yang sama seperti f-string
- Fungsi
f()dapat menghasilkan hasil yang sama seperti f-string
Contoh: structured logging
- Dengan string templat, pesan log dan nilai terstruktur bisa dikeluarkan sekaligus
- Bisa diimplementasikan dengan
StructuredMessageatau subclasslogging.Formatter
Contoh: pemrosesan templat HTML
- Fungsi
html()menangani konten dengan escape yang sesuai atau sebagai atribut, tergantung posisi interpolasi - Templat bertingkat juga didukung
Pola penggunaan lanjutan
- Disarankan menggunakan structural pattern matching (pernyataan
match) - String statis dapat dipakai sebagai cache key untuk memoization yang efisien
- Bisa diparse dan diproses sebagai representasi perantara seperti AST
- Untuk evaluasi lazy atau async, dapat menggunakan
lambdadanawait
Hubungan antara string templat dan string format yang sudah ada
- Fungsi templat dapat didefinisikan dengan cara yang mirip
.format()yang sudah ada from_format()yang mem-parsing string eksternal dan mengubahnya menjadiTemplatejuga dimungkinkan
Kompatibilitas, keamanan, dan pembelajaran
- Pada Python versi lama, ini bisa memunculkan syntax error
- Dari sisi keamanan, pemrosesan templat meningkatkan keselamatan
- Karena sintaksnya mirip f-string, pembelajarannya relatif mudah
Mengapa pendekatan templat baru diperlukan?
- Templat yang ada seperti Jinja ditujukan untuk pengguna kustom atau desainer
- Diperlukan dukungan di level bahasa Python agar pengembang bisa menangani templat secara langsung
- Keunggulan seperti daya ekspresif dan type checking dapat dimanfaatkan
Ringkasan pola contoh
- Structural pattern matching dan pencocokan properti turunan
- Menggunakan kembali templat seperti fungsi
- Dukungan untuk templat bertingkat
- Dukungan evaluasi lazy/async
- Optimasi cache melalui pemisahan bagian statis/dinamis
Pertimbangan desain lainnya
- Templat tidak diubah menjadi string, dan
__str__()tidak diimplementasikan - Kelas terkait disediakan dalam modul
string.templatelib TemplatedanInterpolationdibandingkan berdasarkan identitas objek- Operasi
==atau<tidak didukung
Implementasi referensi dan contoh
- Implementasi CPython
- Tersedia contoh dan pengujian
Ide yang ditolak
- Menggunakan prefiks arbitrer (
my_tag"...") - Evaluasi tertunda untuk semua ekspresi interpolasi
- Implementasi berbasis protokol
- Override
__eq__dan__hash__ - Pemulihan penuh string asli
- Menambahkan tipe
Decoded - Dukungan string templat biner
- Fitur penentuan jenis format ("html", "sql", dll.)
- Pembatasan penggabungan string
- Mengizinkan konverter arbitrer (
!x)
3 komentar
Formatting yang paling memuaskan menurut saya cuma ada di JavaScript dan Python. Bahasa lain agak...
Akan ada satu cara yang jelas—dan sebaiknya hanya satu—untuk melakukannya. (There should be one-- and preferably only one --obvious way to do it.)
Komentar Hacker News
Menarik melihat bagaimana berbagai bahasa menangani pemformatan string
Nick Humrich adalah salah satu penulis yang menulis ulang PEP 501 untuk memperkenalkan t-strings, dan sangat senang dengan diterimanya PEP ini
Tidak yakin apakah fitur di tingkat bahasa memang bernilai
Suka f-strings, tetapi ada masalah karena evaluasinya tidak bisa ditunda
Sebagai maintainer lit-html, menarik melihat kemiripannya dengan tagged template literal di JavaScript
Ada harapan bahwa manfaat tagged template literal JavaScript untuk auto-escape HTML atau parameterisasi SQL juga akan berlaku di Python
Ada pendapat bahwa Python tampaknya berubah menjadi PHP
Keluhan tentang terus ditambahkannya hal-hal baru ke dalam bahasa
Ada pendapat bahwa PEP ini mirip dengan P1819 di C++
Ada pendapat bahwa kode dalam PEP terlalu bertele-tele