print(power.) # power (not wrapper) print(power. doc ) # Raise base to exponent 6. Decorators with arguments (nested factory) def repeat(times): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): for _ in range(times): result = func(*args, **kwargs) return result return wrapper return decorator
@debug def power(base, exp=2): """Raise base to exponent""" return base ** exp print(power
add = logger(add) # manual decoration print(add(3, 5)) @logger def multiply(a, b): return a * b name }") result = func(*args
closure_func = outer("Secret") closure_func() # Secret def logger(func): def wrapper(*args, **kwargs): print(f"Calling {func. name }") result = func(*args, **kwargs) print(f"Finished {func. name }") return result return wrapper 5)) @logger def multiply(a
# DEEP DIVE: Python Decorators (Intermediate to Advanced) def greet(name): return f"Hello, {name}"
say = greet # assign function to variable print(say("Alice")) # Hello, Alice def outer(msg): def inner(): # closure captures 'msg' print(msg) return inner
@repeat(times=3) def say_hi(): print("Hi!")