fstrings.wtf
(fstrings.wtf)- fstrings.wtf, Python'un f-string özelliğine dair anlayışı ölçmek için hazırlanmış çevrimiçi bir quizdir
- En güncel Python 3.13 sürümünde geçerli olan f-string'in çeşitli davranışlarını ve istisna durumlarını test eden sorulardan oluşur
- Kullanıcılar herhangi bir ek süreç olmadan hemen quize başlayabilir
- Gerçek iş ortamında sık karşılaşılan f-string ile ilgili numaraları veya hatalı davranışları önceden deneyimleme fırsatı sunar
1 yorum
Hacker News görüşleri
String interpolation, tip çıkarımı gibi; bir kez alışınca yokluğunu çok rahatsız edici buluyorsunuz. Kademeli olarak daha fazla özellik eklendikçe daha iyi hale geliyor gibi görünse de, bir noktada kodun okunması zorlaştığını fark ediyorsunuz. Genel olarak CS alanında herhangi bir özelliğe daha fazlasını eklemek isteriz, ama matematiksel olarak bunun zor olduğu durumlar da vardır. Burada hem hiç olmaması hem de fazlasıyla çok olması gereken iki uçtan da kaçınmak lazım. Python ve C#, bunu kullanıcı tercihine bırakan yaklaşımı seçmiş. 16 sayfalık karmaşık interpolation string’leri yazabilirsiniz ama ekip arkadaşlarınız bundan hoşlanmayabilir ve kod incelemesinden geçmeyebilir. C++ 23 ise en baştan interpolation’ı yasaklayan bir tarz benimsemiş. Rust ise yalnızca tanımlayıcıların interpolation’ına izin veren çok kısıtlı bir seçenek seçti; bu da bazılarına yetersiz, bazılarına ise fazla gelebilir
Java String Template ekibinin de benzer bir süreç yaşadığını düşünüyorum. Dışarıdan bakınca oldukça şık bir sistemdi ama fiilen kullanmaya çalışınca yönünün sürdürülemez olduğu hissedildi ve sonunda tamamen çıkarıldı. Interpolation özelliğine olan talep ve şimdiye kadar harcanan emek düşünülünce oldukça ilginç bir karar. Sonuçta geri dönülemez hale gelmeden başa dönmeye karar verdiler
Saflık ile pratiklik birbiriyle çatışır ve her dil bunlar arasında farklı bir denge noktası bulur. Kesin bir doğru olmadığı için geliştiriciler de kendi ölçütlerinin doğru olduğunu tekrar tekrar savunur
C#’ta sayı veya tarih biçimlendirmesi gerektiğinde her seferinde önce belgelere bakıyorum. O mini dil o kadar kötü ki özellikle ezberlememeyi seçtim
Karmaşık örneklere takılmadan interpolation’ı makul biçimde kontrol etmek zor olmadı. f-string içinde f-string’i iç içe kullanma ihtiyacı hiç hissetmedim ve sık kullandığım tek format belirteci
:02xRust’ın kısıtlı interpolation biçiminin hiç çözüm olduğunu düşünmüyorum. Yalnızca belirli durumlarda çalıştığı için kod refactor edilirken sürekli buna dikkat etmek gerekiyor ve gereksiz düzenleme işi çıkarıyor. En azından field access’e izin verilmesi gerektiğini düşünüyorum. Buna karşılık Python’da örnekteki gibi tuhaf durumlar olsa da gerçek kullanıcılar bunları dert etmeden f-string’i keyifle kullanıyor
fstring.help gibi yerlerde anlatılan bazı ipuçlarını (ortaya hizalama, 0x/0b/0o önekleri, ASCII gösterimi vb.) yakın zamanda öğrendim. İç içe f-string meselesi de ilgimi çekiyordu; 3.11’e kadar yalnızca tırnak türünü değiştirerek mümkündü. 3.12’de birçok kısıtın temizlendiğini biliyorum. f-string sayesinde işler rahat ama eski
%biçimlendirme,.format()yöntemi ve yeni yaklaşımın ince farkları arasında sürekli gidip gelmek düşündüğümden daha zahmetli ve bundan kaçınmak da sık sık mümkün olmuyor. Kullanılabilirlik gelişti ama hâlâ eski yöntemleri kullanmak zorunda kalındığında ciddi bir eksiklik hissediliyor3.12’de bu kısımların toparlandığını resmi belgede görebilirsiniz
Bazen ekip arkadaşlarımın ya da AI’ın logger çağrılarında f-string kullandığını görüyorum; logger lazy interpolation kullansın diye özellikle öyle tasarlanmışken bu güzel özelliği niye boşa harcadıklarına şaşırıyorum
İç içe f-string bence bir tür numara sorunu. Aynı tarz tırnaklarla iç içe kullanımın eklendiğini biliyordum ama hangi sürümde olduğunu bilmiyordum. Ben hâlâ
f'{f"{}"}'numarasını kullanıyorum, çünkü kodumun biraz daha eski Python sürümlerini de desteklemesini istiyorumf-string’de eşittir işaretiyle (
=) ifadeyi ve değerini birlikte yazdırma özelliğini ilk kez öğrendimPython sürüm notlarını okumaya gerçekten değer veriyorum. Her zaman olumlu sürprizler çıkıyor. Eşittir özelliği Python 3.8’de eklendi ilgili bağlantı
Fonksiyon keyword argümanlarında da benzer bir PEP’in kabul edilmemesi üzücü.
foo(bar=bar)yerinefoo(bar=)olsaydı, sadece argüman geçilen durumlarla fark daha kolay anlaşılır ve debugging için daha verimli olurduYarattığı şaşkınlığa kıyasla yeterince değer üretmeyen bir özellik olduğunu düşünüyorum. Beklenmedik davranma ihtimali yüksek, bu yüzden bir bug kaynağına dönüşmesinden endişeliyim.
locals()’ın yalnızca bir kısmını yazdıran standart bir fonksiyon daha iyi olurduDebug çıktısında inanılmaz sık kullanılan bir kalıp. C++’ta bir ifadeyi tırnak içinde, birini ise düz bırakma alışkanlığı edindim. Hem daha anlaşılır oluyor hem de çok düşünmek gerekmiyor
print(f)ile debug yaparken gerçekten çok kullanışlıURL’nin aksine pratikte gerçekten WTF seviyesinde soru neredeyse yok diye düşünüyorum. 20 ve 21. sorular gibi gerçekten şaşırtıcı birkaç örnek var
Ben walrus operator’dan asla vazgeçemem, o kadar kullanışlı. Pattern matching ve çoklu dal işleme durumlarında kodu çok daha temiz yapıyor. Sık kullanmıyorum ama tam uygun durumda etkisi büyük
Bunun nedeni walrus operator değil, Python’un
string.formatçalışma biçimi. İlgili belgeye bakabilirsinizf-string gelmeden önce ve geldikten sonra Python’u ciddi biçimde kullanmış sayılmam ama sözdizimi kurallarının neredeyse hepsini doğru tahmin ettim; hatta birkaç kez sadece değer döndürmeyle ilgili hata yaptım. Hatta f-string’in Python’daki en az WTF olan kısım olabileceğini düşünüyorum
Lua için f-string benzeri bir kütüphane yaparken epey sözdizimi öğrendim ama
f"{...}"ve walrus operator’u beklemiyordum. Yine de Wat seviyesinde bir tuhaflıktan çok uzak. İlgili kütüphane buradaÖzellikle WTF denecek bir şey olmadığını düşünüyorum. İçeriğin büyük kısmı f-string’den çok
str.format()mini dilinin sözdizimiyle ilgiliÖzellik sayısı fazla ve sanki kritik eşiği aşmış gibi. Tek bir geliştiricinin hepsini bilmesi de gerekmiyor; zaten gerçekten kullanmak gerektiğinde belgelere bakmak zorunda kalmak verimsiz. Seyrek kullanıldığı için sözdizimini unutuyorsunuz ve aynı işlevi doğrudan kendiniz yazmak çoğu zaman çok daha hızlı; ayrıca ekip arkadaşlarınız için özelleştirmesi de daha kolay oluyor. Sol padding mi? 2 satırlık bir fonksiyon yeter. Biçimlendirme sözdiziminde (
nönce mi geliyor,<önce mi vb.) kafa karıştırmaktansa ad-hoc olarak kendim yazmak daha hızlıSol padding gibi şeyler
string.formatmetodunda da kullanılabiliyor ve bu yaklaşım Python 2.6’dan (2008 çıkışlı) beri vardı ilgili belge. Ben ise tam tersine format sözdizimini zihnimde iyi tutuyorum ve faydalı buluyorum. Üstelik biçimlendirme, özelleştirme için hook’lara da açıkBen orta yolu seçmek isterim.
pad_left/pad_rightfonksiyonlarında padding karakterinin de doğrudan keyword argümanı olarak verilebilmesi en rahat yaklaşım olurdu. Günlük hayatta ara sıra gerektiği için standart kütüphanede bulunmasını isterdim. Dil kütüphanesinde böyle şeyler olmayınca zamanla her projede düşük kaliteli yeniden yazımlar ortaya çıkıyor ve iş JavaScript’e benziyor. Benim projelerimde^ya da<>gibi Python biçimlendirmelerine ihtiyaç olmayabilir ama'monospace'çıktının önemli olduğu yazılımlarda bunlar son derece önemli özellikler olabilirBazen tek bir kod tabanında tuhaf özellikleri ya da workaround’ları tekrar tekrar çok kullanırsınız. Bir kez yazıp kopyala-yapıştırla sürekli yeniden kullanmak yaygındır
Eğer bu sözdizimi JavaScript’te olsaydı çoğu kişi bunu sezgisel olmayan sözdizimi ve garip özellikler diye yakınarak anlatırdı
Bence bu quiz’in asıl mesajı, Python’da da JavaScript kadar footgun olduğudur. Sanırım JS hakkında bu tür 'WTF' yazıları çok çıktığı için öyle görünüyor
Ufak numaraları bir kenara bıraksak bile, sezgisel olmayan sözdiziminin tartışmasız kralı bence yine JavaScript. Python’daki f-string unsurları da tuhaf ama ancak belli durumlarda karşınıza çıkıyor; JS’de ise daha iki diziyi karşılaştırmadan bağımlılık kurulumunu beklemek zorunda kalıyorsunuz
JavaScript template literal’ları hakkında sormak istediğim bir şey var. Python’daki gibi
let template = 'hello ${name}';deyip sonratemplate.format({ name: 'joe' })tarzında aynı şablona dinamik olarak defalarca değer basmak JS’de mümkün değil gibi görünüyor. Bu yüzden kendim uygulamak zorunda kaldım. Tagged template gibi şeylere de baktım ama şablonun kendisini yeniden kullanmak zordu. JS sözdizimi ya da garip özellikleriyle dalga geçilmesini tamamen anlayabiliyorumEğer Perl olsaydı muhtemelen tam tersine övgü yağardı
pyformat.info’yu (bağlantı) referans alıyorum; aşırı ayrıntılı değil ama makul örneklerin çoğu orada derlenmiş durumda