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şlevsargigibi 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