1. Type Hints and Modern Python
Implement comprehensive type hints and modern Python patterns for better code reliability and maintainability. This approach ensures better type checking and takes advantage of Python's type system.
from typing import TypeVar, Generic, Optional, List, Dict, Any, Union
from dataclasses import dataclass
from datetime import datetime
from enum import Enum
# Type definitions
class UserRole(str, Enum):
ADMIN = "admin"
USER = "user"
GUEST = "guest"
@dataclass
class UserPreferences:
theme: str
notifications: bool
@dataclass
class User:
id: str
name: str
email: str
role: UserRole
created_at: datetime
preferences: Optional[UserPreferences] = None
# Generic type utility
T = TypeVar('T')
class ApiResponse(Generic[T]):
def __init__(self, data: T, status: int, message: str):
self.data = data
self.status = status
self.message = message
# Type-safe service
class UserService:
def __init__(self, api_url: str):
self.api_url = api_url
async def get_user(self, user_id: str) -> ApiResponse[User]:
try:
# Simulated API call
user_data = {
"id": user_id,
"name": "John Doe",
"email": "[email protected]",
"role": UserRole.USER,
"created_at": datetime.now(),
"preferences": UserPreferences(theme="dark", notifications=True)
}
user = User(**user_data)
return ApiResponse(
data=user,
status=200,
message="User retrieved successfully"
)
except Exception as e:
raise ValueError(f"Failed to fetch user: {str(e)}")
async def update_user(
self,
user_id: str,
updates: Dict[str, Any]
) -> ApiResponse[User]:
try:
# Simulated API call
user_data = {
"id": user_id,
"name": updates.get("name", "John Doe"),
"email": updates.get("email", "[email protected]"),
"role": UserRole(updates.get("role", UserRole.USER)),
"created_at": datetime.now(),
"preferences": UserPreferences(
theme=updates.get("theme", "dark"),
notifications=updates.get("notifications", True)
)
}
user = User(**user_data)
return ApiResponse(
data=user,
status=200,
message="User updated successfully"
)
except Exception as e:
raise ValueError(f"Failed to update user: {str(e)}")
# Example usage
async def main():
user_service = UserService("https://api.example.com")
try:
# Get user
response = await user_service.get_user("123")
print(f"User: {response.data}")
# Update user
updates = {
"name": "Jane Doe",
"role": UserRole.ADMIN
}
response = await user_service.update_user("123", updates)
print(f"Updated user: {response.data}")
except ValueError as e:
print(f"Error: {e}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Why This Rule Matters
- Enables better type safety and error prevention
- Improves code reliability and maintainability
- Facilitates better IDE support and autocompletion
- Reduces runtime errors
- Enables better code documentation
Using with Cursor
Cursor's AI capabilities can help you:
- Suggest type hints
- Generate dataclasses
- Implement generic types
- Improve type safety
- Fix type errors