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.