🎀 What is a Decorator in Python?
A decorator in Python is a powerful tool that allows you to modify or enhance the behavior of functions or methods without changing their actual code. Decorators use the @decorator_name syntax and are widely used in logging, access control, memoization, and more.
They are ideal when:
- 🔄 You want to reuse common logic across multiple functions.
- 🔐 You need to add extra functionality like authentication, logging, or timing.
🛠️ Real-Time Use Cases
- 📋 Logging: Automatically log function calls without modifying the original function.
- ⏱️ Timing: Measure how long a function takes to run.
- ✅ Authentication: Add security checks before allowing a function to execute.
- 📦 Memoization: Cache results of expensive function calls (e.g., in data science apps).
- 📚 Web Frameworks: Flask/Django use decorators for routing URLs to views.
💡 Example: Basic Decorator
def my_decorator(func):
def wrapper():
print("Before the function runs")
func()
print("After the function runs")
return wrapper @my_decorator def greet(): print("Hello, World!")
greet()
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"⏱️ Execution time: {end - start:.4f} seconds")
return result
return wrapper
@timing_decorator
def long_running_task():
total = 0
for i in range(1, 10_000_000):
total += i
print("✅ Task Completed.")
return total
# Call the function
long_running_task()
✅ Task Completed. ⏱️ Execution time: 1.0263 seconds
49999995000000
import datetime
def log_function_call(func):
def wrapper(*args, **kwargs):
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
log_entry = (
f"[{timestamp}] 📝 Called function: '{func.__name__}'\n"
f"➡️ Arguments: {args}, Keyword Arguments: {kwargs}\n"
)
result = func(*args, **kwargs)
log_entry += f"✅ Result: {result}\n\n"
print(log_entry)
# Fix encoding issue by using utf-8
with open("log.txt", "a", encoding="utf-8") as log_file:
log_file.write(log_entry)
return result
return wrapper
💡 How to Use:
Example 1: Login
@log_function_call
def login(username):
return f"User '{username}' logged in."
login("admin")
[2025-06-16 13:35:17] 📝 Called function: 'login'
➡️ Arguments: ('admin',), Keyword Arguments: {}
✅ Result: User 'admin' logged in.
"User 'admin' logged in."
Example 2: API Call
@log_function_call
def get_data(endpoint, id=0):
return {"endpoint": endpoint, "id": id}
get_data("user", id=101)
[2025-06-16 13:35:29] 📝 Called function: 'get_data'
➡️ Arguments: ('user',), Keyword Arguments: {'id': 101}
✅ Result: {'endpoint': 'user', 'id': 101}
{'endpoint': 'user', 'id': 101} - Monitoring Scheduled Job
@log_function_call
def daily_backup():
return "Backup completed successfully."
daily_backup()
[2025-06-16 13:35:57] 📝 Called function: 'daily_backup'
➡️ Arguments: (), Keyword Arguments: {}
✅ Result: Backup completed successfully.
'Backup completed successfully.'
📊 Summary: Decorator Benefits
| Feature | Decorator |
|---|---|
| ♻️ Code Reuse | High — reuse logic across functions |
| ✨ Enhancing Functions | Without changing original function code |
| 📈 Common Use Cases | Logging, timing, auth, web routes |
| 📌 Syntax | Uses @decorator above function |
0