# Python ## Description Python development expertise including type hints, async patterns, virtual environments, and Pythonic idioms. ## When to Use - Working with Python files (.py) - Writing Python scripts or applications - Using Python frameworks (Django, FastAPI, Flask) - Data processing and automation --- ## Core Patterns ### Type Hints ```python from typing import Optional, List, Dict, Union from collections.abc import Callable def process_items( items: List[str], callback: Callable[[str], None], config: Optional[Dict[str, Any]] = None ) -> List[str]: """Process items with optional callback.""" return [callback(item) for item in items] ``` ### Async/Await ```python import asyncio from typing import List async def fetch_data(url: str) -> dict: async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.json() async def fetch_all(urls: List[str]) -> List[dict]: return await asyncio.gather(*[fetch_data(url) for url in urls]) ``` ### Context Managers ```python from contextlib import contextmanager @contextmanager def managed_resource(): resource = acquire_resource() try: yield resource finally: release_resource(resource) # Usage with managed_resource() as r: r.do_something() ``` ### Dataclasses ```python from dataclasses import dataclass, field from datetime import datetime @dataclass class User: id: int email: str name: str created_at: datetime = field(default_factory=datetime.now) def __post_init__(self): self.email = self.email.lower() ``` ### Pydantic Models ```python from pydantic import BaseModel, EmailStr, Field class UserCreate(BaseModel): email: EmailStr name: str = Field(min_length=1, max_length=100) password: str = Field(min_length=8) class Config: str_strip_whitespace = True ``` ## Best Practices 1. Use type hints for all public functions 2. Use dataclasses or Pydantic for data models 3. Prefer context managers for resource management 4. Use async for I/O-bound operations 5. Follow PEP 8 style guidelines ## Common Pitfalls - **Mutable default arguments**: Use `None` and initialize in function - **Not closing resources**: Use `with` statements - **Blocking in async**: Use `asyncio.to_thread()` for CPU work - **Catching bare exceptions**: Be specific with exception types