Python Configuration
Seth HobsonCommunityCreated by Seth Hobson
- Skill
- Guidelines
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to externalizing configuration in Python applications. By leveraging pydantic-settings, developers can move away from hardcoded values toward a robust system that loads, validates, and types configuration data from environment variables. It emphasizes a 'fail-fast' philosophy, ensuring that applications crash immediately with clear error messages if required configuration is missing or invalid at startup.
What it does
- Externalizes environment-specific settings from source code.
- Provides automatic type conversion and validation for configuration values.
- Supports nested configuration structures for complex applications.
- Enables environment-specific behavior using enums and computed fields.
- Integrates with containerized secret management systems.
- Implements fail-fast validation to catch configuration errors at boot time.
When to use it
- When setting up configuration for a new Python project.
- When migrating from hardcoded settings to environment variables.
- When you need to enforce strict validation on application configuration.
- When managing sensitive secrets across different deployment environments.
- When you need to support local development defaults alongside production overrides.
Advantages
- Reduces runtime errors by validating configuration at startup.
- Improves security by keeping secrets out of the codebase.
- Simplifies environment management (dev, staging, prod) via a single interface.
- Enhances code readability by using typed objects instead of scattered os.getenv calls.
- Provides clear, actionable error messages for missing or malformed configuration.
Usage examples
- “How do I define a typed configuration class for my database connection?”
- The agent will provide a Pydantic BaseSettings class with fields for host, port, user, and password, demonstrating how to map them to environment variables.
- “How can I make my application crash if a required API key is missing?”
- The agent will show how to define a required field in a Pydantic model without a default value, which triggers a ValidationError upon instantiation.
- “How do I handle nested configuration groups like database and redis settings?”
- The agent will demonstrate using nested Pydantic models with the env_nested_delimiter configuration to map environment variables like DATABASE__HOST.
- “How can I support local development defaults while requiring production secrets?”
- The agent will explain how to set default values in the Pydantic model for non-sensitive fields while leaving secret fields without defaults to force explicit definition.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/wshobson/python-configuration/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip python-configuration.zip -d .agents/skills
Documentation by Seth Hobson
Python Configuration Management
Externalize configuration from code using environment variables and typed settings. Well-managed configuration enables the same code to run in any environment without modification.
When to Use This Skill
Setting up a new project's configuration system
Migrating from hardcoded values to environment variables
Implementing pydantic-settings for typed configuration
Managing secrets and sensitive values
Creating environment-specific settings (dev/staging/prod)
Validating configuration at application startup
Core Concepts
1. Externalized Configuration
All environment-specific values (URLs, secrets, feature flags) come from environment variables, not code.
2. Typed Settings
Parse and validate configuration into typed objects at startup, not scattered throughout code.
3. Fail Fast
Validate all required configuration at application boot. Missing config should crash immediately with a clear message.
4. Sensible Defaults
Provide reasonable defaults for local development while requiring explicit values for sensitive settings.
Quick Start
from pydantic_settings import BaseSettings
from pydantic import Field
class Settings(BaseSettings):
database_url: str = Field(alias="DATABASE_URL")
api_key: str = Field(alias="API_KEY")
debug: bool = Field(default=False, alias="DEBUG")
settings = Settings() # Loads from environmentFundamental Patterns
Pattern 1: Typed Settings with Pydantic
Create a central settings class that loads and validates all configuration.
from pydantic_settings import BaseSettings
from pydantic import Field, PostgresDsn, ValidationError
import sys
class Settings(BaseSettings):
"""Application configuration loaded from environment variables."""
# Database
db_host: str = Field(alias="DB_HOST")
db_port: int = Field(default=5432, alias="DB_PORT")
db_name: str = Field(alias="DB_NAME")
db_user: str = Field(alias="DB_USER")
db_password: str = Field(alias="DB_PASSWORD")
# Redis
redis_url: str = Field(default="redis://localhost:6379", alias="REDIS_URL")
# API Keys
api_secret_key: str = Field(alias="API_SECRET_KEY")
# Feature flags
enable_new_feature: bool = Field(default=False, alias="ENABLE_NEW_FEATURE")
model_config = {
"env_file": ".env",
"env_file_encoding": "utf-8",
}
# Create singleton instance at module load
try:
settings = Settings()
except ValidationError as e:
print(f"Configuration error:\n{e}")
sys.exit(1)Import settings throughout your application:
from myapp.config import settings
def get_database_connection():
return connect(
host=settings.db_host,
port=settings.db_port,
database=settings.db_name,
)Pattern 2: Fail Fast on Missing Configuration
Required settings should crash the application immediately with a clear error.
from pydantic_settings import BaseSettings
from pydantic import Field, ValidationError
import sys
class Settings(BaseSettings):
# Required - no default means it must be set
api_key: str = Field(alias="API_KEY")
database_url: str = Field(alias="DATABASE_URL")
# Optional with defaults
log_level: str = Field(default="INFO", alias="LOG_LEVEL")
try:
settings = Settings()
except ValidationError as e:
print("=" * 60)
print("CONFIGURATION ERROR")
print("=" * 60)
for error in e.errors():
field = error["loc"][0]
print(f" - {field}: {error['msg']}")
print("\nPlease set the required environment variables.")
sys.exit(1)A clear error at startup is better than a cryptic None failure mid-request.
Pattern 3: Local Development Defaults
Provide sensible defaults for local development while requiring explicit values for secrets.
class Settings(BaseSettings):
# Has local default, but prod will override
db_host: str = Field(default="localhost", alias="DB_HOST")
db_port: int = Field(default=5432, alias="DB_PORT")
# Always required - no default for secrets
db_password: str = Field(alias="DB_PASSWORD")
api_secret_key: str = Field(alias="API_SECRET_KEY")
# Development convenience
debug: bool = Field(default=False, alias="DEBUG")
model_config = {"env_file": ".env"}Create a .env file for local development (never commit this):
# .env (add to .gitignore)
DB_PASSWORD=local_dev_password
API_SECRET_KEY=dev-secret-key
DEBUG=truePattern 4: Namespaced Environment Variables
Prefix related variables for clarity and easy debugging.
# Database configuration
DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp
DB_USER=admin
DB_PASSWORD=secret
# Redis configuration
REDIS_URL=redis://localhost:6379
REDIS_MAX_CONNECTIONS=10
# Authentication
AUTH_SECRET_KEY=your-secret-key
AUTH_TOKEN_EXPIRY_SECONDS=3600
AUTH_ALGORITHM=HS256
# Feature flags
FEATURE_NEW_CHECKOUT=true
FEATURE_BETA_UI=falseMakes the database settings easy to list for debugging. Print only the names, so no value (such as a password inside a connection URL) reaches your terminal or logs:
env | grep -o '^DB_[A-Za-z0-9_]*'Detailed worked examples and patterns
Detailed sections (starting with ## Advanced Patterns) live in references/details.md. Read that file when the navigation summary above is insufficient.
Best Practices Summary
Never hardcode config - All environment-specific values from env vars
Use typed settings - Pydantic-settings with validation
Fail fast - Crash on missing required config at startup
Provide dev defaults - Make local development easy
Never commit secrets - Use
.envfiles (gitignored) or secret managersNamespace variables -
DB_HOST,REDIS_URLfor clarityImport settings singleton - Don't call
os.getenv()throughout codeDocument all variables - README should list required env vars
Validate early - Check config correctness at boot time
Use secrets_dir - Support mounted secrets in containers
Files
- ATTRIBUTION.mdAdded by AutoGineer996 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md6.2 KiB
- references/details.md3.9 KiB
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Seth Hobson
- Publisher
- Seth Hobson (Community)
- Source
- wshobson/agents · plugins/python-development/skills/python-configuration · commit 4bde316
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Seth Hobson or Seth Hobson.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download python-configuration.zip