Python / Core Python Fundamentals Interview Questions
What is a decorator in Python and how do you write one?
A decorator is a function that takes another function as input, wraps it with extra behaviour, and returns the wrapped version. The @decorator syntax is shorthand for func = decorator(func). Decorators exploit the fact that Python functions are first-class objects.
import time def timer(func): def wrapper(*args, **kwargs): start = time.perf_counter() result = func(*args, **kwargs) # call the original end = time.perf_counter() print(f'{func.__name__} took {end-start:.4f}s') return result return wrapper @timer def compute(n): return sum(range(n)) compute(1_000_000) # compute took 0.0312s
The problem with the naive version above is that wrapper.__name__ is 'wrapper', not 'compute', which confuses debuggers and documentation tools. Always apply functools.wraps(func) to the inner wrapper to preserve the original function's metadata:
from functools import wraps def timer(func): @wraps(func) def wrapper(*args, **kwargs): ... return wrapper
Decorators can be stacked — @dec1 over @dec2 applies dec2 first, then dec1. Common built-in decorators: @staticmethod, @classmethod, @property, @functools.lru_cache (memoisation). In frameworks, @app.route in Flask and @pytest.fixture are decorator-based APIs.
More Related questions...