Lakberendezők Pythonban: Útmutató kezdőknek

A Python dekorátorai egy hatékony és hasznos funkció, amely lehetővé teszi egy függvény vagy metódus viselkedésének módosítását úgy, hogy egy másik függvénybe csomagolja. Ezek egy módja annak, hogy a funkciót további funkciókkal „díszítsük”, és gyakran használják általános minták vagy minták tömör alkalmazására.

Hogyan díszítsünk egy funkciót?

A dekorátorok egyik fő felhasználási módja az, hogy további funkciókat adnak egy funkcióhoz anélkül, hogy megváltoztatnák az eredeti funkció kódját. Ez akkor lehet hasznos, ha naplózást, gyorsítótárat vagy más típusú funkciókat szeretne hozzáadni egy függvényhez a kód megváltoztatása nélkül.

Ha Pythonban szeretne díszítőt létrehozni, akkor a @ szimbólumot kell használnia, amelyet a díszítő funkció neve követ. Tegyük fel például, hogy van egy add nevű függvényünk, amely két argumentumot vesz fel, és ezek összegét adja vissza:

def add(a, b):
    return a + b

Létrehozhatunk egy log_function nevű dekorációs függvényt, amely naplózza az add függvény argumentumait és visszatérési értékét:

def log_function(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} called with arguments {args} and keyword arguments {kwargs} returned {result}")
        return result
    return wrapper

A dekorátor add függvényre való alkalmazásához egyszerűen használjuk a @ szimbólumot, amelyet a dekorátor funkció neve követ:

@log_function
def add(a, b):
    return a + b

Most, amikor az add függvény meghívásra kerül, a log_function dekorátor alkalmazásra kerül, és a add függvény argumentumai és visszatérési értéke naplózásra kerül.

Íme egy példa a díszített add funkció használatára:

result = add(1, 2)

Ez a következő üzenetet nyomtatja ki:

Function add called with arguments (1, 2) and keyword arguments {} returned 3

Viselkedés módosítása lakberendezőkkel

A dekorátorok egy funkció viselkedésének módosítására is használhatók úgy, hogy egy másik funkcióba csomagolják, amely további funkciókat ad hozzá. Például létrehozhatunk egy cache nevű dekorátort, amely egy függvény visszatérési értékét tárolja egy szótárban, és visszaadja a gyorsítótárazott értéket, ha a függvényt ugyanazokkal az argumentumokkal hívják meg:

def cache(func):
    cache = {}
    def wrapper(*args, **kwargs):
        key = f"{args}{kwargs}"
        if key in cache:
            return cache[key]
        result = func(*args, **kwargs)
        cache[key] = result
        return result
    return wrapper

@cache
def add(a, b):
    return a + b

Most, amikor először hívják meg a add függvényt egy adott argumentumkészlettel, akkor kiszámítja és visszaadja az eredményt. Ha a add függvényt ismét ugyanazokkal az argumentumokkal hívják meg, akkor a gyorsítótárazott eredményt adja vissza, ahelyett, hogy újra kiszámolná.

Gyakori minták dekorátorokkal

A dekorátorok a gyakori minták tömör felvitelére is használhatók. Tegyük fel például, hogy van egy függvényünk, amely számlistát vesz fel, és visszaadja azok összegét, és egy időzítőt szeretnénk hozzáadni a függvényhez, amely méri, mennyi ideig tart a végrehajtás.

Létrehozhatunk egy timeit nevű dekorátort, amely méri egy függvény végrehajtási idejét és kiírja a konzolra:

import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"Function {func.__name__} took {end - start} seconds to execute")
        return result
    return wrapper

@timeit
def sum_list(numbers):
    result = 0
    for number in numbers:
        result += number
    return result

Most, amikor meghívjuk a sum_list függvényt, nem csak a számok összegét fogja kiszámítani, hanem a végrehajtási időt is kiírja a konzolra:

result = sum_list([1, 2, 3, 4, 5])

Ez a következő üzenetet nyomtatja ki:

Function sum_list took 0.000001 seconds to execute

Következtetés

A dekorátorok a Python hatékony és hasznos funkciói, amelyek segítségével tömör és rugalmas módon módosítható egy függvény vagy metódus viselkedése. Akár naplózást, gyorsítótárat szeretne hozzáadni, akár gyakori mintákat szeretne alkalmazni, a lakberendezők segítenek ezt letisztult és elegáns módon megtenni.

Köszönöm az olvasást és jó kódolást! Ha tetszett ez a cikk a dekorátorok Pythonban való erejéről, és többet szeretne megtudni a Pythonról és más programozási témákról, feltétlenül kövessen engem további informatív és éleslátó cikkekért.