15 poin oleh GN⁺ 2025-04-22 | 2 komentar | Bagikan ke WhatsApp
  • t-string adalah fitur pemrosesan string yang aman dan fleksibel yang baru diperkenalkan di Python 3.14
  • Berbeda dari f-string yang sudah ada, t-string mengembalikan objek Template, bukan string, sehingga memungkinkan pemrosesan aman tanpa output otomatis
  • t-string memiliki struktur yang memungkinkan escape aman untuk input dinamis seperti HTML, SQL, dan lainnya
  • Konsepnya mirip dengan tagged templates di JavaScript, sehingga dapat diperluas untuk berbagai transformasi dan pemrosesan
  • Jika ekosistem alat pengembang Python mendukung fitur ini dengan baik, hal ini dapat membawa perubahan besar pada cara pemrosesan string yang berfokus pada web/keamanan

Fitur baru Python: t-string (Template Strings)

  • Mulai Python 3.14, Template string (t-strings) yang digunakan dengan sintaks t"..." diperkenalkan sebagai fitur resmi
  • Berbeda dari f-string yang sudah ada, t-string dievaluasi sebagai objek string.templatelib.Template, bukan langsung sebagai string
  • Objek ini memerlukan proses pengolahan terpisah sebelum ditampilkan, dan melalui proses ini dimungkinkan penanganan serta transformasi nilai dinamis secara aman

Mengapa f-string bisa berbahaya?

  • Karena f-string langsung dievaluasi menjadi string, kode yang menyertakan input pengguna dapat menimbulkan SQL Injection atau XSS
    • Contoh: f"<div>{user_input}</div>" → kode serangan dapat disisipkan secara langsung
  • t-string menunda evaluasi semacam ini sehingga hanya bisa digunakan setelah diproses secara eksplisit

Contoh penggunaan t-string

  • Contoh pemrosesan escape HTML:

    evil = "<script>alert('bad')</script>"  
    template = t"<p>{evil}</p>"  
    safe = html(template)  
    # safe adalah "<p>&lt;script&gt;alert('bad')&lt;/script&gt;</p>"  
    
  • Pemrosesan yang lebih kompleks seperti penyisipan atribut otomatis juga dimungkinkan:

    attributes = {"src": "roquefort.jpg", "alt": "Yum"}  
    template = t"<img {attributes} />"  
    element = html(template)  
    # hasil: "<img src='roquefort.jpg' alt='Yum' />"  
    

Struktur dan API

  • Objek Template menyediakan teks asli dan nilai yang disisipkan secara terpisah melalui properti .strings dan .values

  • Detail format seperti !s, :>8, dan lainnya juga dapat diakses melalui properti interpolations

  • Keadaan campuran antara teks dan nilai juga bisa diproses langsung melalui iterasi

  • Pembuatan manual juga dimungkinkan:

    from string.templatelib import Template, Interpolation  
    template = Template(  
      "Hello ",  
      Interpolation(value="World", expression="name"),  
      "!"  
    )  
    

Contoh menarik: konverter Pig Latin

  • Contoh yang mengubah kata-kata menjadi Pig Latin dengan mengiterasi isi objek Template:

    def pig_latin(template: Template) -> str:  
        ...  
    name = "world"  
    template = t"Hello {name}!"  
    assert pig_latin(template) == "Hello orldway!"  
    

Arah perkembangan ke depan

  • t-string dapat membawa keamanan dan ekstensibilitas ke cara pemrosesan string yang berfokus pada web/keamanan
  • Diharapkan alat pengembang seperti black, ruff, dan VS Code mendukung format/highlighting t-string
  • Karena mirip dengan tagged templates yang akrab bagi pengembang JavaScript, peluang pemanfaatannya di berbagai framework juga tinggi

Kolaborasi dengan komunitas pengembang

  • Fitur ini diselesaikan melalui partisipasi dan kolaborasi berbagai anggota komunitas Python
  • Secara khusus disebutkan interaksi dengan tokoh-tokoh kunci seperti Jim, Paul, Koudai, Lysandros, dan Guido
  • PEP 750 dan repositori contoh-contohnya dapat dilihat di GitHub

Fitur t-string di Python 3.14 sekaligus menghadirkan keamanan dan ekstensibilitas pada string, serta menjadi lompatan penting yang melampaui keterbatasan f-string yang ada

2 komentar

 
GN⁺ 2025-04-22
Opini Hacker News
  • Secara keseluruhan, fitur ini cukup keren. Pada dasarnya, ini mengubah kode seperti berikut

    db.execute("QUERY WHERE name = ?", (name,))
    

    menjadi seperti ini

    db.execute(t"QUERY WHERE name = {name}")
    

    Ada pertanyaan apakah gula sintaks ini cukup bermanfaat untuk membenarkan kompleksitas fitur bahasa yang baru. Saya rasa dalam kasus ini, jawabannya iya, karena dua alasan

    • Adalah hal yang baik jika pengembang library bisa melakukan apa yang mereka inginkan melalui ekspansi {}, dan kemungkinan ini akan menghasilkan use case yang bagus
    • Mungkin juga baik untuk menggeneralisasi sintaks template di seluruh bahasa agar semua library menyelesaikan masalah dengan cara yang sama
  • Saya juga berharap ekosistem tooling beradaptasi untuk mendukung t-strings. Misalnya, akan bagus jika black dan ruff memformat isi t-string, dan vscode memberi pewarnaan untuk jenis konten umum seperti HTML atau SQL

    • Pandangan tentang t-strings ini sangat aneh. Satu-satunya cara untuk menyimpulkan bahwa template string harus berubah menjadi HTML atau SQL yang valid adalah berdasarkan sintaks string yang tampak jelas, dan itu hanya bisa dilakukan sebagai solusi sementara, bukan sesuatu yang terkait dengan fitur template string itu sendiri
    • Dalam cara fitur ini dirancang, tidak ada penanda pada string itu sendiri tentang jenis kontennya atau akan diubah menjadi apa pada akhirnya. Semua itu ditangani oleh fungsi konversi
    • Seperti yang ditambahkan orang lain, sesuatu seperti sql"select * from {table}" mungkin bisa melakukan itu, tetapi tidak ada jaminan bahwa apa yang ada di dalam template akan diubah oleh fungsi konversi menjadi SQL yang valid. t"give me {table} but only {columns}" bisa saja diubah menjadi SQL yang valid setelah template diproses
  • Apakah kita bisa memakai sintaks SQL yang rapi seperti berikut?

    city = 'London'
    min_age = 21
    # Find all users in London who are 21 or older:
    users = db.get(t'
      SELECT * FROM users
      WHERE city={city} AND age>{min_age}
    ')
    

    Jika fungsi db.get() menerima template, maka seharusnya bisa. Ini akan menjadi cara paling rapi untuk memakai SQL yang pernah saya lihat sejauh ini

  • Secara pribadi, menurut saya fitur ini terlalu berfokus pada masalah yang terlalu spesifik untuk menjadi fitur umum. Python terus membesar. Ketika orang bertanya apakah Python mudah dipelajari dan sederhana, kita harus menjawab, "dasarnya iya, tetapi mempelajari seluruh bahasanya tidak"

    • Dalam hal ini, Go menarik karena menolak hampir semua fitur. Sejujurnya saya tidak yakin generic layak karena menambah banyak kompleksitas. Saya rasa ide umum untuk menjaga bahasa tetap pada fokus awalnya itu benar. C++ mungkin adalah kasus ekstrem, karena bahasanya sendiri hampir tidak mirip lagi dengan saat pertama kali dimulai
  • Diskusi besar (414 poin, 10 hari lalu, 324 komentar) tautan

  • Cukup keren. Kalau kita mem-port fitur JS, apakah berikutnya kita bisa mendapatkan dictionary unpacking/destructuring?

    • Saya sangat, sangat menginginkan fitur ini. Ini alasan utama saya kembali ke JS
    >>> {a, b=45, c=None, **d} = {'a': 234, xzy: 32456}
    >>> print(a, b, c, d)
    234 45 None {'xyz': 32456}
    
  • Rasanya agak seperti "curang" kalau fitur x-string baru hanya dibangun sebagai bawaan. Akan keren kalau kita bisa melakukan sesuatu seperti ini

    from foo import bar
    bar"zoop"
    
  • Zen of Python tahun 2025:

    There should be one-- and preferably only one --obvious way to do it.
    

    Pemformatan string Python tahun 2025:

    • t-strings
    • f-strings
    • %-operator
    • +-operator
    • str.format()
  • Saya tidak paham bagaimana ini berbeda dari menerapkan fungsi ke variabel f-string di dalam template. Jadi, alih-alih seperti ini:

    evil = "<script>alert('bad')</script>"
    template = t"{evil}"
    safe = html(template)
    

    mengapa tidak langsung begini saja:

    evil = "<script>alert('bad')</script>"
    safe = f"{html(evil)}"
    

    Atau sebelum membuat f-string. Apakah ini hanya agar orang tidak lupa bagian sanitasi/manipulasi string dan dipaksa melewatinya?

  • Halo! Saya yang menulis artikel ini :-)

    • Saya agak terlambat masuk ke percakapan, dan sedikit terkejut melihat artikel ini menjadi tren di HN, tetapi saya dengan senang hati akan menjawab pertanyaan. Saya akan berusaha ikut sesekali sepanjang hari