EMZETT.
Giriş yap

Python: dekoratörler

Kısaca: Dekoratör, başka bir işlevi alıp genişletilmiş bir sürümünü döndüren işlevdir. İşlevin üzerine @ad yazarak uygularsın.

Biraz daha ayrıntılı: Özgün işlevi sarar; öncesinde veya sonrasında bir şey yapmak için: süre ölçmek, erişimi denetlemek, sonuçları önbelleğe almak, çağrıları günlüğe yazmak.

Ayrıntılı

import functools, time
 
def sure_olc(f):
    @functools.wraps(f)
    def sargi(*args, **kwargs):
        basla = time.perf_counter()
        sonuc = f(*args, **kwargs)
        print(f.__name__, time.perf_counter() - basla)
        return sonuc
    return sargi
 
@sure_olc
def hesapla(n): ...
  • Eşdeğer: hesapla’nın üzerindeki @sure_olc, hesapla = sure_olc(hesapla) ile aynıdır.
  • functools.wraps: Özgün işlevin adını ve belgelendirmesini korur. Onsuz işlev sargi gibi görünür.
  • Parametreli: Argümanlı bir dekoratör (@tekrarla(3)), bir dekoratör döndüren işlevdir (bir iç içe katman daha).
  • Yerleşik ve tanınmış: @staticmethod, @property, @functools.lru_cache, Flask’ta rotalar (@app.route), @pytest.fixture.
  • Sınıflar: Dekoratörler sınıfları da genişletebilir (@dataclass).
  • Not: Tasarım desenle karıştırma, bkz. Decorator deseni.

Ayrıca bak: Dataclass’lar, Lambda