Decorator là higher-order function nhận một function và trả về function mới với hành vi bổ sung — cú pháp @decorator là syntactic sugar.
Dùng @functools.wraps để giữ metadata của function gốc.
python
import functools, time
def timer(func):
@functools.wraps(func) # Giữ __name__, __doc__
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
print(f"{func.__name__}: {time.perf_counter()-start:.4f}s")
return result
return wrapper
@timer
def slow():
time.sleep(1)Pitfall: Không dùng @functools.wraps → mất __name__, __doc__ của function gốc.