CodeBlanks Logo Icon CodeBlanks

Özet - İleri decorator'lar

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

main.py
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

main.py
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

Soru
from functools import wraps, lru_cache

@____(maxsize=None)
@repeat(3)
def slow_square(n):
    return n * n
Cevap
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

İleri seviye bölümündeki tüm dersler