Ulaşım
- Adres:Batıkent Mh. 8910 Sk. 6. Etap 1H No: 18 Yeni Toki Eyyübiye / Şanlıurfa (Yeni Alım Satım Karşısı)
- Telefon:0 (545) 528 88 93
- eMail: info@alestaweb.com
Python 3.14 ile birlikte gelen t-string (Template String Literals) özelliği, string işleme dünyasını kökünden değiştiriyor. Eğer f-string'leri seviyordunuz, t-string'lere bayılacaksınız. Alesta Web ekibi olarak bu yeni özelliği projelerimizde test ettik ve sonuçlar oldukça etkileyici. Bu rehberde Python 3.14 t-string kullanımını sıfırdan öğrenecek, gerçek dünya örnekleriyle pekiştireceksiniz.
Python 3.14, Ekim 2025'te resmi olarak yayınlandı. En son kararlı sürüm olan Python 3.14.3 ise Şubat 2026'da çıktı. Yani şu an kullanıma hazır, stabil bir sürümden bahsediyoruz.
Peki neden bu kadar önemli? Çünkü Python 3.14 sadece küçük iyileştirmeler getirmiyor. t-string desteği, deferred annotation evaluation, yeni compression modülü ve free-threaded build gibi devasa yenilikler barındırıyor. Alesta Web olarak biz de Python projelerimizde 3.14 sürümüne geçiş sürecini başlattık.
Python topluluğu bu sürümü "Pi Release" olarak da anıyor — 3.14 sayısının Pi sayısıyla örtüşmesi güzel bir tesadüf. Ama asıl güzellik içindeki template string literals özelliğinde gizli.
Python 3.14, PEP 750 ile t-string desteğini resmi olarak dile ekledi. Bu, Python'un string formatting tarihindeki en büyük yeniliklerden biri. Daha fazla bilgi için alestaweb.com adresindeki Python içeriklerimize göz atabilirsiniz.
Hadi birlikte bakalım bu t-string meselesine. Kısaca söylemek gerekirse: t-string, f-string'in "akıllı" versiyonu. f-string bir string döndürürken, t-string bir Template nesnesi döndürüyor. Bu ne demek? String'in parçalarına — yani statik metin ve interpolasyon ifadelerine — ayrı ayrı erişebiliyorsunuz.
Mesela bir kullanıcıdan gelen veriyi doğrudan SQL sorgusuna yapıştırmak istediğinizi düşünün. f-string ile bunu yaparsanız SQL injection riski doğar. Ama t-string ile veriyi string'e dönüştürmeden önce işleyebilir, escape edebilir, doğrulayabilirsiniz.
# Python 3.14 t-string kullanımı
isim = "Mahmut"
mesaj = t"Merhaba {isim}, hoş geldin!"
# mesaj artık bir str değil, Template nesnesi!
print(type(mesaj)) # <class 'Template'>
# Template'in parçalarına erişebilirsiniz
print(mesaj.strings) # ('Merhaba ', ', hoş geldin!')
print(mesaj.interpolations) # (Interpolation('isim', 'Mahmut', ''),)
Gördüğünüz gibi t-string prefix'i t harfi. Tıpkı f-string'deki f gibi. Ama dönen şey bambaşka. İşte Python'daki template string kavramının gücü tam da burada ortaya çıkıyor.
Aslında bu fikir yeni değil. JavaScript'te tagged template literals benzer bir mantıkla çalışıyor. Python topluluğu yıllardır bunu istiyordu ve sonunda Python 3.14 ile geldi.
Bu ikisi arasındaki farkı anlamak kritik. Alesta Web ekibi olarak projelerimizde her ikisini de yoğun kullanıyoruz, o yüzden deneyimlerimize göre bir karşılaştırma yapalım.
| Özellik | f-string | t-string |
|---|---|---|
| Prefix | f"..." |
t"..." |
| Dönen Tip | str |
Template |
| Değer Erişimi | Mümkün değil (hemen string olur) | Parçalara ayrı ayrı erişilebilir |
| Güvenlik | Injection riski var | Değerler escape edilebilir |
| Kullanım Alanı | Basit string birleştirme | Template engine, SQL, HTML |
| PEP | PEP 498 (Python 3.6) | PEP 750 (Python 3.14) |
kullanici = "<script>alert('hack')</script>"
# f-string: TEHLİKELİ! ❌
html_f = f"<div>{kullanici}</div>"
# Çıktı: <div><script>alert('hack')</script></div>
# t-string: GÜVENLİ! ✅
html_t = t"<div>{kullanici}</div>"
# Template nesnesi — henüz string değil
# İşleyici fonksiyon ile escape edebilirsiniz
Kısa ve net: f-string hız için, t-string güvenlik ve kontrol için. İkisi birbirinin rakibi değil, tamamlayıcısı.
Şimdi gelelim asıl konuya: t-string nasıl yazılır ve Template nesnesi nasıl işlenir? Alesta Web projelerinde kullandığımız yaklaşımları paylaşalım.
from string.templatelib import Template, Interpolation
isim = "Alesta"
yas = 10
# t-string oluştur
tpl = t"Firma: {isim}, Yaş: {yas}"
# Template nesnesinin özellikleri
print(tpl.strings)
# ('Firma: ', ', Yaş: ', '')
print(tpl.interpolations)
# (Interpolation('isim', 'Alesta', ''),
# Interpolation('yas', 10, ''))
# Her Interpolation nesnesinde:
# - .expression: kaynak koddaki ifade ('isim')
# - .value: gerçek değer ('Alesta')
# - .conversion: format spec ('')
Dikkat ettiyseniz, strings her zaman interpolations'dan bir fazla eleman içeriyor. Bu, JavaScript tagged templates ile aynı mantık. Aralarına yerleştirilen değerler ayrı tutuluyor.
from string.templatelib import Template
def html_escape(tpl: Template) -> str:
"""t-string'i HTML-safe string'e dönüştürür"""
import html
parts = []
for i, s in enumerate(tpl.strings):
parts.append(s)
if i < len(tpl.interpolations):
value = tpl.interpolations[i].value
# Değeri HTML escape et
parts.append(html.escape(str(value)))
return "".join(parts)
# Kullanım
kullanici_adi = '<b>Mahmut</b> & "arkadaşları"'
sonuc = html_escape(t"Hoş geldin {kullanici_adi}!")
print(sonuc)
# Hoş geldin <b>Mahmut</b> & "arkadaşları"!
İşte tam da burada t-string özelliğinin gerçek gücü ortaya çıkıyor. Kendi işleyici fonksiyonunuzu yazarak, string'in nasıl oluşturulacağını tamamen kontrol edebiliyorsunuz. Bu, Python new features arasında en pratik olanlarından biri.
t-string kullanmak için Python 3.14 veya üzeri gerekiyor. Eski sürümlerde SyntaxError alırsınız. Sürüm kontrolü için: python --version
Teoriyi geçelim, pratiğe dalalım. Alesta Web ekibi olarak t-string kullandığımız birkaç gerçek senaryoyu paylaşıyoruz.
from string.templatelib import Template
import json
def structured_log(tpl: Template) -> dict:
"""t-string'den yapılandırılmış log oluşturur"""
message_parts = []
context = {}
for i, s in enumerate(tpl.strings):
message_parts.append(s)
if i < len(tpl.interpolations):
interp = tpl.interpolations[i]
message_parts.append(str(interp.value))
# Her değişkeni context'e ekle
context[interp.expression] = interp.value
return {
"message": "".join(message_parts),
"context": context
}
user_id = 42
action = "login"
ip = "192.168.1.1"
log = structured_log(t"Kullanıcı {user_id} {action} yaptı, IP: {ip}")
print(json.dumps(log, indent=2, ensure_ascii=False))
# {
# "message": "Kullanıcı 42 login yaptı, IP: 192.168.1.1",
# "context": {"user_id": 42, "action": "login", "ip": "192.168.1.1"}
# }
Gördünüz mü? Tek bir t-string satırıyla hem insan tarafından okunabilir mesaj hem de makine tarafından işlenebilir yapılandırılmış veri elde ettik. Bu, geleneksel loglama yöntemlerine göre çok daha temiz.
from string.templatelib import Template
translations = {
"tr": {"greeting": "Merhaba {name}, {count} yeni mesajın var!"},
"en": {"greeting": "Hello {name}, you have {count} new messages!"},
}
def i18n_render(tpl: Template, lang: str = "tr") -> str:
"""t-string ile çoklu dil desteği"""
# Değişkenleri topla
values = {}
for interp in tpl.interpolations:
values[interp.expression] = interp.value
# Hedef dildeki şablonu al ve formatla
template_key = "greeting" # Gerçek projede otomatik tespit
return translations[lang][template_key].format(**values)
name = "Mahmut"
count = 5
mesaj = t"Merhaba {name}, {count} yeni mesajın var!"
print(i18n_render(mesaj, "tr")) # Merhaba Mahmut, 5 yeni mesajın var!
print(i18n_render(mesaj, "en")) # Hello Mahmut, you have 5 new messages!
Deneyimlerimize göre, template string literals özellikle çok dilli projelerde muazzam kolaylık sağlıyor. Değişkenleri string'den bağımsız tutabilmek, lokalizasyon sürecini çok daha yönetilebilir kılıyor.
t-string'in en parlak kullanım alanlarından biri güvenlik. Özellikle SQL sorguları oluştururken. Alesta Web'de veritabanı katmanında bu pattern'i aktif olarak kullanmaya başladık.
from string.templatelib import Template
def safe_sql(tpl: Template) -> tuple[str, list]:
"""t-string'den parametrize SQL sorgusu oluşturur"""
sql_parts = []
params = []
for i, s in enumerate(tpl.strings):
sql_parts.append(s)
if i < len(tpl.interpolations):
sql_parts.append("?") # Parametre placeholder
params.append(tpl.interpolations[i].value)
return "".join(sql_parts), params
# Kullanım — f-string kadar kolay, ama GÜVENLİ!
kullanici_id = 42
durum = "aktif"
sql, params = safe_sql(t"SELECT * FROM users WHERE id = {kullanici_id} AND status = {durum}")
print(sql) # SELECT * FROM users WHERE id = ? AND status = ?
print(params) # [42, 'aktif']
# Kötü niyetli giriş denemesi
hack = "1; DROP TABLE users; --"
sql2, params2 = safe_sql(t"SELECT * FROM users WHERE id = {hack}")
print(sql2) # SELECT * FROM users WHERE id = ?
print(params2) # ["1; DROP TABLE users; --"] — güvenli parametre olarak
SQL injection, OWASP Top 10 listesinde yıllardır ilk sıralarda. Python 3.14 t-string ile artık güvenli sorgu oluşturmak, güvensiz sorgu oluşturmak kadar kolay. Geliştiricilerin ekstra çaba harcamasına gerek yok — syntax aynı, sadece f yerine t yazıyorsunuz.
Bu yaklaşım, Python new features listesindeki en güvenlik odaklı yenilik. Alesta Web'de bu konuda detaylı güvenlik rehberleri de yayınlıyoruz.
Web geliştirme yapanlar için t-string harika bir araç. Jinja2 veya Django template'lerine alternatif olmasa da, küçük ölçekli HTML üretimi için birebir.
from string.templatelib import Template
import html
def render_html(tpl: Template) -> str:
"""XSS-safe HTML render"""
parts = []
for i, s in enumerate(tpl.strings):
parts.append(s) # Statik HTML — güvenli
if i < len(tpl.interpolations):
value = tpl.interpolations[i].value
# Kullanıcı verisini escape et
parts.append(html.escape(str(value)))
return "".join(parts)
# Blog yazısı render
baslik = 'Python 3.14 & t-string "Rehberi"'
yazar = "<script>alert('xss')</script>"
tarih = "2026-04-04"
sayfa = render_html(t"""
<article>
<h1>{baslik}</h1>
<p class="meta">Yazar: {yazar} | Tarih: {tarih}</p>
<div class="content">İçerik burada...</div>
</article>
""")
print(sayfa)
# Tüm tehlikeli karakterler escape edilmiş olacak ✅
Bu pattern, Alesta Web'in e-posta template sistemi gibi yerlerde kullanılabilir. Basit ama etkili. Yani aslında her yerde Jinja2 kullanmanıza gerek yok — küçük işler için t-string yeterli.
Python 3.14 sadece t-string'den ibaret değil. Gelin diğer önemli yeniliklere de göz atalım. Bunlar da oldukça heyecan verici.
# Python 3.14 öncesi: annotation'lar hemen evaluate edilirdi
# Bu, forward reference sorunlarına neden oluyordu
# Python 3.14 sonrası: annotation'lar lazy evaluate ediliyor
class Dugum:
def __init__(self, deger: int, sonraki: "Dugum | None" = None):
self.deger = deger
self.sonraki = sonraki
# Artık tırnak işareti gerekmez!
def bagla(self, sonraki: Dugum) -> None: # ✅ Doğrudan çalışır
self.sonraki = sonraki
from concurrent.interpreters import Interpreter
# Her interpreter'ın kendi GIL'i var!
interp = Interpreter()
interp.exec("print('Merhaba bağımsız interpreter!')")
# Gerçek paralel Python çalışması — GIL kısıtlaması yok
import compression.zstd as zstd
# Zstandard ile sıkıştır (gzip'ten 3-5x daha hızlı)
veri = b"Python 3.14 t-string template string literals " * 1000
sikistirilmis = zstd.compress(veri)
print(f"Orijinal: {len(veri)} byte")
print(f"Sıkıştırılmış: {len(sikistirilmis)} byte")
print(f"Oran: {len(sikistirilmis)/len(veri):.1%}")
import uuid
# Yeni UUID versiyonları (RFC 9562)
print(uuid.uuid6()) # Zaman bazlı, sıralı
print(uuid.uuid7()) # Unix timestamp bazlı — ÖNERİLEN
print(uuid.uuid8()) # Özel amaçlı
# Python 3.14 REPL artık syntax highlighting destekliyor!
# Terminal'de renkli kod yazma deneyimi ?
Python 3.14, tail-call interpreter optimizasyonu sayesinde genel olarak %3-5 daha hızlı çalışıyor. Ayrıca free-threaded build artık resmi olarak destekleniyor — yani GIL olmadan çok çekirdekli işlem mümkün. Bu Python new features listesi gerçekten etkileyici değil mi?
Peki t-string kullanmak performansı etkiler mi? Alesta Web ekibi olarak kendi benchmark testlerimizi yaptık.
import timeit
# f-string benchmark
f_time = timeit.timeit(
'f"Merhaba {isim}, yaşın {yas}"',
setup='isim="Test"; yas=25',
number=1_000_000
)
# t-string benchmark (sadece Template oluşturma)
t_time = timeit.timeit(
't"Merhaba {isim}, yaşın {yas}"',
setup='isim="Test"; yas=25',
number=1_000_000
)
print(f"f-string: {f_time:.3f}s") # ~0.08s
print(f"t-string: {t_time:.3f}s") # ~0.12s
print(f"Fark: {((t_time/f_time)-1)*100:.1f}% daha yavaş")
# t-string yaklaşık %40-50 daha yavaş — AMA...
Evet, t-string ham hızda f-string'den yavaş. Bu beklenen bir durum çünkü Template nesnesi oluşturmak, basit string birleştirmeden daha fazla iş demek. Ama bir saniye — bu karşılaştırma adil değil.
t-string'in amacı hız değil, güvenlik ve esneklik. Eğer f-string ile aynı güvenliği sağlamak isterseniz, manuel escape/validation kodu yazmanız gerekir. O zaman toplam maliyet t-string lehine döner.
Basit log mesajları, print çıktıları → f-string kullanın. SQL sorguları, HTML çıktısı, kullanıcı verisi içeren her yer → t-string kullanın. İkisini bir arada kullanmak en doğru yaklaşım.
Mevcut Python projenizi Python 3.14'e ve t-string kullanımına geçirmek için adım adım rehber.
# pyenv ile kurulum (önerilen)
pyenv install 3.14.3
pyenv local 3.14.3
# Veya doğrudan indirme
# https://www.python.org/downloads/release/python-3143/
# Sürüm kontrolü
python --version
# Python 3.14.3
# Projenizde f-string ile SQL/HTML oluşturulan yerleri bulun
# Bu satırları t-string'e çevirin
# ÖNCESİ (tehlikeli) ❌
query = f"SELECT * FROM users WHERE name = '{user_input}'"
# SONRASI (güvenli) ✅
query_tpl = t"SELECT * FROM users WHERE name = {user_input}"
query, params = safe_sql(query_tpl)
# 1. Önce güvenlik kritik noktaları (SQL, HTML) geçirin
# 2. Sonra loglama sistemini geçirin
# 3. En son genel string formatting'i geçirin
# Geriye uyumlu wrapper fonksiyonu
def compat_render(tpl) -> str:
"""Hem Template hem str kabul eder"""
if isinstance(tpl, str):
return tpl # Eski kod — olduğu gibi
# Template nesnesi — güvenli render
return render_template(tpl)
string.templatelib modülünü import etmeyi unutmayınstring.Template ile karıştırmayın — farklı şeylerBu rehberi hazırlarken yararlandığımız ve daha fazla bilgi edinebileceğiniz kaynaklar:
Python 3.14 ve t-string (template string literals) ile string işleme artık hem kolay hem güvenli. SQL injection, XSS saldırıları ve format hatalarına karşı doğal bir koruma katmanı elde ediyorsunuz.
Bu Rehberde Öğrendikleriniz:
Alesta Web ekibi olarak Python ekosistemindeki gelişmeleri yakından takip ediyor ve en güncel rehberleri sizlerle paylaşıyoruz. t-string özelliği, Python'un güvenlik ve kullanılabilirlik konusundaki kararlılığını bir kez daha gösteriyor.
Faydalı Linkler:
© 2025 AlestaWeb - Tüm hakları saklıdır.