51 puan yazan GN⁺ 2025-04-24 | 5 yorum | WhatsApp'ta paylaş
  • Python’da yaygın olarak bilinmeyen 14 gelişmiş özellik, gerçek örneklerle tanıtılıyor
  • typing, generics, protocols, context managers gibi konularda statik tipleme ve yapısal tasarım hakkında derinlemesine açıklamalar sunuluyor
  • Python 3.10 ve sonrasında eklenen yapısal desen eşleme ile slots ve metaclass gibi performans optimizasyon teknikleri de yer alıyor
  • f-string, cache, future, proxy, for-else, walrus gibi daha temiz kod yazmak için ipuçları da bulunuyor
  • Her özellik için ek öğrenme bağlantıları ve referanslar sunuluyor; junior geliştiricilerin de kolayca yaklaşabileceği bir yapı sunuyor

Python’un 14 gelişmiş özelliğinin özeti

# Tipleme overload’ı

  • @overload dekoratörü, tek bir fonksiyon için birden fazla tip imzası tanımlamayı mümkün kılar
  • Tip denetleyicisi, iletilen argüman değerlerine göre dönüş tipini doğru şekilde çıkarabilir
  • Literal kullanarak string değerlerini kısıtlamak da mümkündür
  • Yalnızca id veya username alanlarından birini zorunlu alan fonksiyon imzaları da uygulanabilir
  • Tip güvenliği için hafif bir Enum alternatifi olarak Literal kullanılabilir

# Sadece anahtar kelime / sadece konumsal argümanlar

  • * kullanılırsa sadece anahtar kelimeyle verilen argümanlar tanımlanabilir (konumsal argüman kullanılamaz)
  • / kullanılırsa sadece konumsal argümanlar tanımlanabilir (anahtar kelime argümanı kullanılamaz)
  • API tasarımında argüman kullanım biçimi açık şekilde zorunlu kılınabilir

# Gelecek anotasyonları (__future__)

  • Tip ipuçları normalde çalışma anında hemen değerlendirildiği için bildirim sırası sorunları oluşabilir
  • from __future__ import annotations ile değerlendirme zamanını ertelemek mümkündür
  • Ancak bu yöntem string işleme biçiminde çalıştığından, çalışma anında tip kullanırken dikkat gerekir
  • PEP 649, __annotations__ özniteliği için gecikmeli değerlendirme yaklaşımıyla bir iyileştirme önerir

# Generic sözdizimi

  • Python 3.12 ile birlikte yeni bir generic tip tanımlama sözdizimi destekleniyor
  • TypeVar yerine class Foo[T, U: int] biçimiyle daha sezgisel kullanım mümkün
  • Değişken uzunluklu generic’ler (Variadic Generics) de eklenerek farklı tiplerin işlenmesi mümkün hale geliyor
  • Tip takma adı tanımlamak da sadeleşti; type Vector = list[float] biçiminde kullanılabiliyor

# Protokoller (Protocols)

  • Duck Typing’in tip denetimli sürümü olarak yapısal alt tipleme uygulanabilir
  • Bir sınıf belirli metotlara sahipse, tip kalıtımı olmadan da tip uyumluluğu sağlanabilir
  • @runtime_checkable ile isinstance denetimi de mümkün olacak şekilde genişletilebilir

# Context manager

  • __enter__, __exit__ metotlarına sahip nesneler with bloğunda kullanılır
  • contextlib.contextmanager dekoratörü ile basit, fonksiyon tabanlı bir uygulama yapılabilir
  • yield öncesi ve sonrasında kurulum ve temizlik işlemleri gerçekleştirilir

# Yapısal desen eşleme

  • match-case sözdizimiyle karmaşık veri yapıları sezgisel biçimde dallandırılabilir
  • Tuple/list yapısökümü, OR pattern, guard koşulu (if) ve wildcard kullanılabilir
  • Verinin yapısına göre dallanabildiği için okunabilirlik ve bakım kolaylığı artar

# __slots__ optimizasyonu

  • __dict__ yerine sabit slot’lar kullanılarak bellek ve hız optimizasyonu sağlanır
  • __slots__, yalnızca öznitelik adlarını belirten bir tuple kullanır
  • Sınıfa gereksiz öznitelik eklenmesini engeller
  • Ancak mikro optimizasyon düzeyinde olduğu için kullanımında dikkatli olmak gerekir

# Python kod stili ipuçları derlemesi

  • for-else yapısı: Döngü break olmadan biterse else çalışır
  • Walrus operatörü (:=): Değişken tanımı ve kontrol aynı anda yapılabilir
  • or kısa devre değerlendirmesi: Birden fazla değer arasından doğru olan ilk değeri döndürür
  • Karşılaştırma operatörü zincirleme: 0 < x < 10 gibi ifadelerle kod sadeleştirilebilir

# f-string gelişmiş biçimlendirme

  • f"{değişken=}" sözdizimiyle debug amaçlı gösterim yapılabilir
  • Sayı biçimleri (:.2f, :+.2f, :,), tarih biçimleri (%Y-%m-%d) gibi çeşitli seçenekler vardır
  • Ortaya hizalama, padding, yüzde gösterimi gibi biçimlendirme mini dili kullanılabilir

# Cache dekoratörleri

  • @lru_cache ve @cache ile fonksiyon sonuçları saklanarak hız artırılabilir
  • Özyinelemeli fonksiyonlarda veya çok tekrar eden hesaplamalarda faydalıdır
  • @cache, Python 3.9’dan itibaren eklenmiştir ve varsayılan olarak sınırsız cache sunar

# Python Future

  • JS’deki Promise’e benzer asenkron nesne işleme özelliği sunar
  • Future.set_result(), add_done_callback() gibi yapılarla sonuçlar asenkron olarak yönetilir
  • asyncio.Future() await ile birlikte kullanılabilir
  • ThreadPoolExecutor ile birlikte kullanıldığında arka planda paralel işleme de mümkündür

# Proxy property

  • Tek bir sınıf özniteliğinin hem özellik gibi hem de fonksiyon gibi davranmasını sağlar
  • __get__, __call__, __repr__ ile iki farklı işlev sunulabilir
  • API tasarımında varsayılan değer ile parametreli çağrıyı tek bir yapıda ele almak mümkün olabilir
  • Pratik kullanımdan çok deneysel bir örnek olarak bakmaya değerdir

# Metaclass

  • Sınıfın kendisini oluşturan sınıfın sınıfıdır
  • Sınıf özniteliklerini değiştirme veya otomatik kayıt gibi meta mantıklar uygulanabilir
  • Gerçekte çoğu durumda dekoratörlerle değiştirilebilir
  • Django, SQLAlchemy, Pydantic gibi yapılarda metaclass’lar içeride kullanılır

5 yorum

 
hackerpropoker 2025-04-29

Backend açısından, metaclass'ların hata ayıklamayı zorlaştırdığı bir deneyim yaşamıştım.

 
ilotoki0804 2025-04-28

for-else yapısının okunabilirlik veya açıklık açısından çok güçlü olmadığı yönünde görüşler bulunduğunu ve bu nedenle çoğu zaman bir anti-pattern olarak görüldüğünü; ayrıca asyncio.Future'ın asyncio'nun dahili bir uygulama ayrıntısı olarak ele alındığını unutmayın.

 
dkmin 2025-04-26

Teşekkürler. Özellikle 10. maddeyi hemen uygulamaya alıyorum.

AI kodlama kurallarına eklendi..

 
yangeok 2025-04-25

Harika ipucu, teşekkürler

 
GN⁺ 2025-04-24
Hacker News görüşleri
  • Merhaba! Blogun orijinal yazarıyım! Yazımın sabah 4'te HN'nin ilk sayfasına çıktığını görünce şaşırdım

    • Bu yazı, blogu başlatmadan bir ay önce yazdığım 14 küçük tweet ile başladı
    • Blogu başlatırken bu tweet'leri ilk gönderi olarak yeniden kullanmaya karar verdim
    • Bu yüzden akış biraz tuhaf gelebilir
    • Pazartesi günleri faydalı bir şey, cuma günleri ise biraz daha sıra dışı bir şey bulmaya çalıştım
    • Başlık da aynı şekilde, Python kullanırken ilginç bulduğum 14 özelliği bir araya getiriyor
    • Başlığı düşünmek için sadece yaklaşık 5 saniye harcadım
  • Python kullandığım her seferde kodun sanki Python'ı yanlış kullanıyormuş gibi görünüp görünmeyeceğinden endişe ediyorum

    • Python hakkında bilmediğim derin ayrıntılar ve değişiklikler beni şaşırtıyor
    • Go, kodun yıllar sonra bile geri kalmış görünmeyeceğine dair güven veriyor
    • Harika bir yazı
  • Python, Python olarak kalmalı; golang, Rust ve Typescript de kendi felsefelerine ve tasarımlarına sahip olmalı

    • 28 yıldır 4 dilde kod yazıyorum ve Python'daki değişiklikler hoşuma gitmiyor
    • Python'ın popüler olmasının nedeni tip denetimi ya da anotasyonlar gibi ek katmanlar değildi
    • Benzer şeyleri diğer dillerde de gördüm
    • Yakın zamanda tanıtılan özelliklerin kapsamlı bir listesi
    • Okurların faydalı bulabileceği önceki bir liste de var
  • Python'ın en büyük avantajı, çalıştırılabilir sözde kod gibi hissettirmesi

    • Dil, alan düzeyindeki talimatların önüne geçmiyor
    • Ne kadar çok özellik eklenirse çekiciliği o kadar azalıyor
    • Çoğu insan Python'ı derinlemesine anlamıyor
  • 9.3 bölümündeki değerlendirmeye bir itiraz: boş bir string varsa değerlendirme farklı yapılıyor

    • if-else ifadesi boş string'i geçerli kabul ediyor, ancak or işleci onu None ile eşdeğer sayıyor
  • Javascript/Typescript'ten Python'a geçen biri olarak faydalı bir kaynak

    • typing overload, Javascript'in talihsiz bir özelliği için var ve bunu teknik borç olarak görüyorum
    • sadece anahtar sözcükle ve sadece konuma göre verilen argümanlar, sözdizimi fazla kısa olduğu için okunabilirlik açısından endişe veriyor
    • future annotations son zamanlarda çok yardımcı oldu
    • protocol'ler Typescript'e benziyor ama Python'a özgü hissettirmiyor
    • metaclass'lar, kendine özgü sorunları çözebilen güçlü araçlar
  • Özelliklerin çoğu ileri seviye değil

    • metaclass'lardan, karmaşık davranışlara yol açabildikleri için kaçınma eğilimindeyim
    • 'proxy property' bir özellik değil
  • Listede değiştirmek istediğim şey, collections.abc kapsayıcılarının dahil edilmesi

    • Birçok yorumda walrus operatöründen hoşlanılmıyordu, ama iyi kullanım alanları bulduktan sonra onu faydalı şekilde kullanıyorum
    • Düzenli ifade pattern'leri kullanırken kod çok daha temiz hale geliyor
  • Bu yazıyı okumaktan keyif aldım

    • Özelliklerin çoğu typing modülüne ait özellikler
    • generic'ler ve protocol'ler konusunda emin değildim
    • Modern, üretim düzeyindeki Python kodunun her yerde tip kullanıp kullanmadığını merak ediyorum