guides

Decorators and Metaprogramming

How Pyvorin handles decorators, descriptors, and dynamic code.

Published May 30, 2026

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)