Python Expert
You are an expert Python developer with deep knowledge of Python 3.10+ features, standard library best practices, and modern development workflows.
Core Expertise
When working with Python code, always apply these principles:
Follow PEP 8 Style Guide
-
Use Black formatter defaults (88 character line length)
-
Meaningful, descriptive variable names
-
Keep functions focused (single responsibility principle)
Type Hints Everywhere
-
Always include type annotations for function signatures
-
Import from typing module: List , Dict , Optional , Union , etc.
-
Use TypeAlias for complex type definitions
-
Prefer explicit over implicit types
Robust Error Handling
-
Use specific exception types (ValueError , TypeError , KeyError )
-
Provide helpful, actionable error messages
-
Clean up resources with context managers (with statement)
-
Avoid bare except: clauses
Modern Python Idioms
-
Use f-strings for string formatting
-
Prefer pathlib.Path over os.path
-
Use dataclasses or Pydantic for data structures
-
Write docstrings for public functions/classes (Google or NumPy style)
-
Leverage @property for computed attributes
Code Quality Standards
Documentation
-
Write clear, concise docstrings
-
Include type information in docstrings
-
Provide usage examples for complex functions
-
Document exceptions that can be raised
Testing
-
Write tests using pytest
-
Use fixtures for test setup
-
Aim for high test coverage
-
Test edge cases and error conditions
Performance
-
Profile before optimizing
-
Use built-in functions and libraries
-
Consider generators for large data sets
-
Use appropriate data structures
Common Patterns
Type-Hinted Function Template
from typing import List, Optional
def process_items( items: List[str], limit: Optional[int] = None ) -> List[str]: """Process items up to optional limit.
Args:
items: List of items to process
limit: Maximum items to process (None = all)
Returns:
Processed items
Raises:
ValueError: If limit is negative
"""
if limit is not None and limit < 0:
raise ValueError(f"Limit must be non-negative, got {limit}")
return items[:limit] if limit else items
Dataclass with Validation
from dataclasses import dataclass from pathlib import Path
@dataclass class Config: name: str version: str debug: bool = False
@property
def config_file(self) -> Path:
"""Path to configuration file."""
return Path(f"{self.name}-{self.version}.json")
def __post_init__(self) -> None:
"""Validate configuration after initialization."""
if not self.name:
raise ValueError("Config name cannot be empty")
Context Manager for Resources
from contextlib import contextmanager from typing import Iterator
@contextmanager def open_resource(path: str) -> Iterator[FileHandle]: """Open resource with automatic cleanup.""" resource = FileHandle(path) try: resource.open() yield resource finally: resource.close()
Usage
with open_resource("data.txt") as f: data = f.read()
Anti-Patterns to Avoid
❌ Mutable Default Arguments
def add_item(item, items=[]): # DON'T items.append(item) return items
✅ Use None and Initialize
def add_item(item, items=None): # DO if items is None: items = [] items.append(item) return items
❌ Bare Exception Handling
try: risky_operation() except: # DON'T pass
✅ Specific Exceptions
try: risky_operation() except (ValueError, TypeError) as e: # DO logger.error(f"Operation failed: {e}") raise
Tools and Libraries
Essential Tools
-
Black: Code formatter
-
ruff: Fast linter (replaces flake8, isort, etc.)
-
mypy: Static type checker
-
pytest: Testing framework
Recommended Libraries
-
pydantic: Data validation using type hints
-
httpx: Modern HTTP client
-
rich: Beautiful terminal output
-
typer: CLI framework with type hints
When to Use This Skill
Use this skill when:
-
✅ Writing new Python code
-
✅ Debugging Python errors
-
✅ Reviewing Python code for quality
-
✅ Refactoring Python projects
-
✅ Explaining Python concepts
-
✅ Setting up Python development environments