Özet - İleri decorator'lar
- Python kursu
- İleri seviye
- Ders 6/83
- 5 dk
lru_cache, partial ve class decorator'u birleştirerek bir cache katmanı yazarsın.
Özet - İleri decorator'lar
Bu grupta decorator'lerin ileri yönlerini gördün. Parametreli decorator üç katmanlıdır: factory → decorator → wrapper. Class decorator __call__ ile durum tutar.
functools modülünün üç aracı vardı: wraps meta veriyi korur, lru_cache sonuçları önbelleğe alır, partial argüman bağlar, reduce diziyi tek değere katlar.
Son görevde parametreli bir decorator'ü lru_cache ile birleştireceksin: hem tekrar sayısı hem önbellek bir arada.
Uygulama repeat + lru_cache birleşimi
repeat(n) parametreli decorator'ünü yaz (factory, deco, wrapper; @wraps(fn) ile). wrapper, fn(*args) çağrısını n kez yapsın ve son çağrının sonucunu döndürsün. slow_square(n) fonksiyonunu @lru_cache(maxsize=None) ve @repeat(3) ile süsle (lru_cache en üstte). slow_square(4) çağrısının sonucunu print() ile yazdır.
Başlangıç kodu
from functools import wraps, lru_cache
# repeat(n): factory → deco → wrapper; n kez çağır, sonucu döndür
# wraps decorator ile wrapper'ı süsle
# slow_square'ı lru_cache(maxsize=None) decorator'ü ile de süsle (en üstte)
# son olarak slow_square(4) çağrısının sonucunu yazdır
@repeat(3)
def slow_square(n):
return n * nÖrnek çözüm
from functools import wraps, lru_cache
def repeat(n):
def deco(fn):
@wraps(fn)
def wrapper(*args):
result = None
for _ in range(n):
result = fn(*args)
return result
return wrapper
return deco
@lru_cache(maxsize=None)
@repeat(3)
def slow_square(n):
return n * n
print(slow_square(4))Beklenen çıktı
16
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Birleştirilen decorator zinciri hangi sırayla çalışır?
- Önce lru_cache, sonra repeat
- Önce repeat, sonra lru_cache Doğru cevap
- Aynı anda paralel
- Sadece repeat, lru_cache yoksayılır
Açıklama: @repeat(3) önce uygulanır; her çağrıda lru_cache sarmalanmış fonksiyonun sonucunu önbelleğe alır.
2 Decorator'ü lru_cache ile birleştir
from functools import wraps, lru_cache
@____(maxsize=None)
@repeat(3)
def slow_square(n):
return n * n
from functools import wraps, lru_cache
@lru_cache(maxsize=None)
@repeat(3)
def slow_square(n):
return n * n
Açıklama: @lru_cache(maxsize=None) en üstte; repeat(3) altta önce uygulanır.
3 Grup kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
repeat(n) |
Parametreli factory |
class Counter |
Durum tutar |
lru_cache |
Sonuç önbelleği |
partial |
Argüman bağlar |