Python SyntaxError: f-string: expecting '}' hatası, f-string içinde başlayan bir ifadenin doğru kapanmadığını gösterir. Çözüm için yalnızca eksik } karakterini aramak yeterli değildir; f-string’in dış tırnaklarını, ifade içindeki tırnakları ve parantezleri birlikte kontrol etmek gerekir.
F-string, başına f öneki getirilen ve metnin içine Python ifadeleri yerleştirmeye izin veren bir metin biçimidir.
Python "SyntaxError: f-string: expecting '}'" hatası ne anlama gelir?

F-string’in başındaki f, Python’a metin içinde değişken veya başka bir Python ifadesi değerlendirileceğini bildirir. Dış tırnaklar metnin tamamının sınırını belirler. Süslü parantezler ise ifadenin nerede başlayıp nerede bittiğini gösterir. Örneğin:
ogrenci = "Ece"
puan = 92
mesaj = f"{ogrenci} sınavdan {puan} aldı."
print(mesaj)
Bu kodda {ogrenci} ve {puan} bölümleri birer Python ifadesidir. F-string bu ifadeleri değerlendirip metne yerleştirir. Beklenen çıktı şöyledir:
Ece sınavdan 92 aldı.
expecting '}' ifadesi, Python ayrıştırıcısının bir ifade sınırını tamamlamak için kapanış } karakterini beklediği anlamına gelir. Bir açılış { karakterinden sonra kapanış parantezi yazılmamışsa veya ifade başka bir karakter nedeniyle bozulmuşsa bu hata görülebilir.
Ancak hata her zaman doğrudan eksik bir } karakterinden kaynaklanmaz. Fazladan ya da yanlış konumlandırılmış bir süslü parantez, f-string’in dış tırnaklarını erken kapatan bir iç tırnak veya ifade içinde dengesi bozulan iç içe parantezler de aynı hata mesajına yol açabilir.
Editördeki hata imleci de sorunun gerçek konumunu her zaman göstermeyebilir. Ayrıştırıcı, bozuk karakteri gördüğü anda değil, ifadeyi artık sürdüremediği daha sonraki bir tırnak, parantez veya satır sonunda durabilir. Bu nedenle imlecin bulunduğu yeri tek başına incelemek yerine, ilgili f-string içindeki açılış { karakterlerini, kapanış } karakterlerini ve tırnak çiftlerini birlikte karşılaştırmak gerekir.
Üç adımda eksik veya yanlış süslü parantez ve tırnak nasıl bulunur?

SyntaxError: f-string: expecting '}' gördüğünde imlecin hemen önüne } eklemekle başlama. Ayrıştırıcı, eksik kapanışı fark ettiği noktayı işaretleyebilir ve bu nokta asıl bozuk karakterle aynı olmayabilir. F-string'i aşağıdaki üç kontrolle tara.
- F-string'in sınırlarını bul. Satırdaki
fveyaFönekini, dış tırnak çiftini ve her{ifade}alanının başlangıç ve bitişini işaretle. Ardından imleçten önceki karakterleri geriye doğru izle. En son açılan{karakterinin, tırnağın, köşeli parantezin ve yuvarlak parantezin kapanıp kapanmadığını kontrol et. Böylece sorunun metin bölümünde mi, ifade bölümünde mi olduğunu ayırabilirsin. - Kapanışları ve tırnakları eşleştir. Eksik, fazla veya yanlış konumlanmış
}karakterlerini; dış ve iç tırnakların çakışmasını;[]ve()çiftlerini; fonksiyon ve sözlük erişim ifadelerinin sınırlarını denetle. Dış f-string tırnağıyla aynı tür iç tırnağın ayrıştırılması Python çalışma ortamına göre değişebileceği için, teşhis sırasında dışta çift, sözlük anahtarlarında tek tırnak kullanmak sınırları daha görünür kılar.Hatalı kod:
urun = {"ad": "Kulaklık", "fiyat": 799} print(f"Ürün: {urun['ad']}, Fiyat: {urun['fiyat']")İkinci ifade kapanmadığı için şu hata görülebilir:
SyntaxError: f-string: expecting '}'Düzeltilmiş kod:
urun = {"ad": "Kulaklık", "fiyat": 799} print(f"Ürün: {urun['ad']}, Fiyat: {urun['fiyat']} TL") print(f"İndirimli fiyat: {(urun['fiyat'] * 0.9):.2f} TL")Sözlük erişimleri kendi köşeli parantezlerini, aritmetik ifade ise kendi yuvarlak parantezlerini kapatır. Beklenen çıktı:
Ürün: Kulaklık, Fiyat: 799 TL İndirimli fiyat: 719.10 TLYalnızca
}eklemek her durumda çözüm değildir. Kapanış zaten fazlaysa veya yanlış ifade sınırına konduysa başka birSyntaxErroralabilirsin; aynı hata metnini beklememelisin. - Metin parantezlerini iki kez yaz. Çıktıda değişken değil, gerçek süslü parantez görünecekse
{{ve}}kullan:
print(f'Şablon: {{urun_adi}}')
Beklenen çıktı:
Şablon: {urun_adi}
F-string içinde çift süslü parantezler, çıktı olarak tek bir gerçek süslü parantez üretir.
Ürün adı ve fiyatı örneğinde hatalı kod nasıl düzeltilir?
Ürün adı ve fiyatı aynı f-string içinde yazılırken her değişken ifadesi kendi süslü parantez çiftiyle tamamlanmalıdır. Bu örnekte {product_name} alanı kapanıyor, ancak {price ifadesinin kapanış } karakteri eksik kalıyor. Python bu nedenle f-string'in sonuna kadar kapanmayan bir ifade görür ve SyntaxError: f-string: expecting '}' hatasını üretir.
| Hata mesajı | Hatalı kod | Düzeltilmiş kod | Beklenen çıktı |
|---|---|---|---|
SyntaxError: f-string: expecting '}' |
product_name='Defter' |
product_name='Defter' |
Ürün: Defter, Fiyat: 120 |
product_name='Defter'
price=120
print(f'Ürün: {product_name}, Fiyat: {price}')
İlk ifade {product_name} açılıp kapanır. İkinci ifade de {price} biçiminde tamamlanmalıdır. Düzeltilen }, price ifadesinin sınırını kapatır. Satırın sonundaki ) ise print() çağrısının parantezidir. Bu iki karakter farklı görevler üstlenir.
Hata imleci eksik } karakterinin tam üzerinde görünmeyebilir. Python kapanışı f-string'in ilerleyen bölümünde aradığı için imleç satırın sonuna veya hatalı ifadenin çevresine kayabilir. Bu durumda yalnızca imlecin gösterdiği karakteri değil, aynı f-string içindeki tüm açılan ve kapanan süslü parantezleri kontrol et.
Metin olarak gerçek bir süslü parantez göstermek istediğinde f-string içinde {{ ve }} kullanılır. Bu örnekte amaç parantezi yazdırmak değil, price ifadesini kapatmaktır; bu nedenle tek bir } yeterlidir.
Düzeltmeyi uyguladıktan sonra, benzer f-string hatalarını ayırt etme düzeyini isteğe bağlı olarak Python bilgi testi ile kontrol edebilirsin.