Decorators and Metaprogramming
May 30, 2026 | 5 min read
Function Decorators
def timer(fn):
def wrapper(*args, **kwargs):
import time
start = time.time()
result = fn(*args, **kwargs)
elapsed = time.time() - start
print(f"{fn.__name__} took {elapsed:.4f}s")
return result
return wrapper
@timer
def compute(data):
return sum(x * x for x in data)
Class Decorators
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
lru_cache
@lru_cache(maxsize=128)
def expensive_lookup(key: str) -> dict:
return fetch_from_db(key)