Python Decorators
Enhance functions using decorators.
Add functionality to functions.
Basic Decorator
```python def uppercase_decorator(func): def wrapper(): result = func() return result.upper() return wrapper
@uppercase_decorator def greet(): return "hello from boston"
print(greet()) # HELLO FROM BOSTON ```
Decorator with Arguments
```python def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): func(*args, **kwargs) return wrapper return decorator
@repeat(3) def say_hi(name): print(f"Hi {name}!")
say_hi("Tom") # Hi Tom! # Hi Tom! # Hi Tom! ```
Timing Decorator
```python import time
def timer(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"Time: {end - start:.4f}s") return result return wrapper
@timer def slow_function(): time.sleep(1) print("Done!")
slow_function() # Done! # Time: 1.0023s ```
Login Required Decorator
```python def login_required(func): def wrapper(user): if user.get("logged_in"): return func(user) else: print("Please login first!") return wrapper
@login_required def view_profile(user): print(f"Welcome {user['name']}!")
user = {"name": "Alice", "logged_in": True} view_profile(user) # Welcome Alice! ```
Remember
- Decorators modify function behavior - Use @decorator_name syntax - *args, **kwargs for flexibility