- 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
Backend açısından, metaclass'ların hata ayıklamayı zorlaştırdığı bir deneyim yaşamıştım.
for-elseyapı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ıcaasyncio.Future'ınasyncio'nun dahili bir uygulama ayrıntısı olarak ele alındığını unutmayın.Teşekkürler. Özellikle 10. maddeyi hemen uygulamaya alıyorum.
AI kodlama kurallarına eklendi..
Harika ipucu, teşekkürler
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
Python kullandığım her seferde kodun sanki Python'ı yanlış kullanıyormuş gibi görünüp görünmeyeceğinden endişe ediyorum
Python, Python olarak kalmalı; golang, Rust ve Typescript de kendi felsefelerine ve tasarımlarına sahip olmalı
Python'ın en büyük avantajı, çalıştırılabilir sözde kod gibi hissettirmesi
9.3 bölümündeki değerlendirmeye bir itiraz: boş bir string varsa değerlendirme farklı yapılıyor
orişleci onuNoneile eşdeğer sayıyorJavascript/Typescript'ten Python'a geçen biri olarak faydalı bir kaynak
Özelliklerin çoğu ileri seviye değil
Listede değiştirmek istediğim şey, collections.abc kapsayıcılarının dahil edilmesi
Bu yazıyı okumaktan keyif aldım