15 puan yazan GN⁺ 2025-04-22 | 2 yorum | WhatsApp'ta paylaş
  • t-string'ler (t-strings), Python 3.14 ile gelen yeni bir güvenli ve esnek metin işleme özelliğidir
  • Mevcut f-string'lerden farklı olarak t-string, bir metin değil Template nesnesi döndürür; böylece otomatik çıktı üretmeden güvenli işlem yapılabilir
  • t-string, HTML, SQL gibi dinamik girdileri güvenli biçimde escape etme yapısına sahiptir
  • JavaScript'teki tagged templates kavramına benzer; çeşitli dönüşüm ve işleme genişletmeleri yapılabilir
  • Python geliştirme araçları ekosistemi bu özelliği iyi desteklerse, web/güvenlik odaklı metin işleme yaklaşımında büyük bir değişim yaratabilir

Python'un yeni özelliği: t-string'ler (Template Strings)

  • Python 3.14 ile t"..." sözdizimiyle kullanılan Template string'ler (t-strings) resmî bir özellik olarak geliyor
  • Mevcut f-string'lerden farklı olarak t-string, doğrudan bir metin yerine string.templatelib.Template nesnesi olarak değerlendirilir
  • Bu nesne, çıktıdan önce ayrı bir işleme aşaması gerektirir; bu süreç sayesinde dinamik değerler güvenli biçimde işlenip dönüştürülebilir

f-string neden riskli olabilir?

  • f-string anında metne dönüştürüldüğü için, kullanıcı girdisi içeren kodlarda SQL Injection veya XSS ortaya çıkabilir
    • Örnek: f"<div>{user_input}</div>" → saldırı kodu doğrudan eklenebilir
  • t-string bu değerlendirmeyi geciktirerek, yalnızca açıkça işlendikten sonra kullanılabilmesini sağlar

t-string kullanım örnekleri

  • HTML escape işleme örneği:

    evil = "<script>alert('bad')</script>"  
    template = t"<p>{evil}</p>"  
    safe = html(template)  
    # safe is "<p>&lt;script&gt;alert('bad')&lt;/script&gt;</p>"  
    
  • Özelliklerin otomatik eklenmesi gibi daha karmaşık işlemler de mümkün:

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

Yapı ve API

  • Template nesnesi, .strings ve .values özellikleri üzerinden kaynak metni ve eklenen değerleri ayrı sunar

  • interpolations özelliği sayesinde !s, :>8 gibi biçimlendirme ayrıntılarına da erişilebilir

  • Yineleme (iteration) ile metin ve değerlerin karışık durumları da doğrudan işlenebilir

  • Elle oluşturmak da mümkündür:

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

Eğlenceli bir örnek: Pig Latin dönüştürücü

  • Template nesnesinin içeriğini dolaşıp kelimeleri Pig Latin'e dönüştüren örnek:

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

Gelecekteki gelişim yönü

  • t-string'ler, web/güvenlik odaklı metin işleme yaklaşımına güvenlik ve genişletilebilirlik kazandırabilir
  • black, ruff, VS Code gibi geliştirme araçlarının t-string biçimlendirme/vurgulama desteği sunması bekleniyor
  • JavaScript geliştiricilerinin alışık olduğu tagged template yaklaşımına benzer olduğu için, çeşitli framework'lerde de kullanım potansiyeli yüksek

Geliştirici topluluğuyla iş birliği

  • Bu özellik, çeşitli Python topluluğu üyelerinin katılımı ve iş birliğiyle tamamlandı
  • Özellikle Jim, Paul, Koudai, Lysandros ve Guido gibi kilit isimlerle yapılan etkileşimlerden söz ediliyor
  • PEP 750 ve örnek deposu GitHub üzerinden incelenebilir

Python 3.14'ün t-string özelliği, metinlerde güvenlik ve genişletilebilirliği aynı anda sağlayarak mevcut f-string'lerin sınırlarını aşan önemli bir sıçrama sunuyor

2 yorum

 
GN⁺ 2025-04-22
Hacker News yorumu
  • Genel olarak bu özellik oldukça hoş. Temelde şu kodu

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

    şuna dönüştürüyor

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

    Bu sözdizimsel şekerin, yeni bir dil özelliğinin getirdiği karmaşıklığa değecek kadar faydalı olup olmadığı sorusu var. Bu durumda iki nedenle değdiğini düşünüyorum

    • Kütüphane geliştiricilerinin {} genişletmesi üzerinden istediklerini yapabilmesi iyi bir şey ve muhtemelen iyi kullanım örnekleri ortaya çıkaracaktır
    • Şablon sözdizimini dil genelinde genelleştirip tüm kütüphanelerin aynı sorunu aynı şekilde çözmesini sağlamak muhtemelen iyi bir şey
  • Ayrıca araç ekosisteminin t-strings desteğine uyum sağlamasını umuyorum. Örneğin black ve ruff t-string içeriğini biçimlendirse, vscode da HTML veya SQL gibi yaygın içerik türlerini renklendirse güzel olurdu

    • t-strings hakkındaki bu görüş çok tuhaf. Şablon dizgesinin geçerli HTML ya da SQL'e dönüştürülmesi gerektiğinin çıkarılabileceği tek yol, dizgenin bariz sözdizimine bakmaktır; bu da ancak geçici bir çözüm olabilir ve şablon dizgesi özelliğiyle ilgili değildir
    • Özelliğin tasarlanış biçiminde, dizgenin kendisinde ne tür içerik taşıdığına ya da sonunda neye dönüştürüleceğine dair bir işaret yok. Her şey dönüşüm fonksiyonu tarafından ele alınıyor
    • Başkalarının da eklediği gibi, sql”select * from {table}” gibi bir şey bunu yapabilirdi, ancak şablondaki ifadenin dönüşüm fonksiyonu tarafından geçerli SQL'e çevrileceğinin garantisi yok. t“give me {table} but only {columns}” ifadesi, şablon işlendiğinde geçerli SQL'e dönüşebilir
  • Şöyle temiz bir SQL sözdizimi kullanabilir miyiz?

    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}
    ')
    

    Eğer db.get() fonksiyonu şablonu kabul ediyorsa, evet. Şimdiye kadar SQL kullanmanın gördüğüm en temiz yolu bu olurdu

  • Şahsen bu özellik, genel amaçlı bir özellik olmak için fazla spesifik bir soruna odaklanmış gibi geliyor. Python giderek büyüyor. İnsanlar Python'un öğrenmesinin kolay ve basit olup olmadığını sorduğunda, "temelleri evet, ama dilin tamamını öğrenmek o kadar değil" demek gerekiyor

    • Bu açıdan Go, neredeyse tüm özellikleri reddetmesiyle ilginç. Açıkçası generics'in bu kadar karmaşıklık eklemeye değip değmediğinden emin değilim. Dili asıl odağına sadık tutma fikrinin genel olarak doğru olduğunu düşünüyorum. C++, dilin başladığı zamana artık neredeyse hiç benzememesi bakımından bunun uç örneği olabilir
  • Büyük tartışma (414 puan, 10 gün önce, 324 yorum) bağlantı

  • Oldukça hoş. Madem JS özellikleri taşınıyor, sırada dictionary unpacking/destructuring gelebilir mi?

    • Bu özelliği inanılmaz derecede istiyorum. JS'ye geri dönmemin başlıca nedenlerinden biri bu
    >>> {a, b=45, c=None, **d} = {'a': 234, xzy: 32456}
    >>> print(a, b, c, d)
    234 45 None {'xyz': 32456}
    
  • Yeni x-string özelliğinin yerleşik olarak gelmesi bana biraz "hile" gibi geliyor. Şöyle bir şey yapabilsek hoş olurdu

    from foo import bar
    bar"zoop"
    
  • 2025'in Zen of Python'ı:

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

    2025'te Python string formatting:

    • t-strings
    • f-strings
    • %-operator
    • +-operator
    • str.format()
  • Şablona uygulanacak fonksiyonun, f-string içindeki değişkene fonksiyon uygulamaktan nasıl farklı olduğunu anlamıyorum. Yani şunun yerine:

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

    neden doğrudan şunu yapmıyoruz:

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

    Ya da f-string oluşturmadan önce. Mesele sadece arındırma/string manipulation kısmını unutmayı önlemek ve bunu zorunlu kılmak mı?

  • Merhaba! Bu yazıyı ben yazdım :-)

    • Sohbete biraz geç kaldım ve bu yazının HN'de trend olduğunu görünce biraz şaşırdım, ama soruları memnuniyetle yanıtlarım. Gün boyunca fırsat buldukça katılmaya çalışacağım