All skills
wshobson avatar

/python-configuration

@be57c0b
by Seth Hobsonwshobson/agents40k stars
4,281

Python configuration management via environment variables and typed settings. Use when externalizing config, setting up pydantic-settings, managing secrets, or implementing environment-specific behavior.

Use this Skill: https://skilld.dev/gh/wshobson/agents/python-configuration

This session only. Nothing lands on disk.

referencesdetails.md

≈1k tokens on demand. Your agent reads this file only when SKILL.md points to it.

python-configuration — detailed worked examples

Advanced Patterns

Pattern 5: Type Coercion

Pydantic handles common conversions automatically.

from pydantic_settings import BaseSettings
from pydantic import Field, field_validator

class Settings(BaseSettings):
    # Automatically converts "true", "1", "yes" to True
    debug: bool = False

    # Automatically converts string to int
    max_connections: int = 100

    # Parse comma-separated string to list
    allowed_hosts: list[str] = Field(default_factory=list)

    @field_validator("allowed_hosts", mode="before")
    @classmethod
    def parse_allowed_hosts(cls, v: str | list[str]) -> list[str]:
        if isinstance(v, str):
            return [host.strip() for host in v.split(",") if host.strip()]
        return v

Usage:

ALLOWED_HOSTS=example.com,api.example.com,localhost
MAX_CONNECTIONS=50
DEBUG=true

Pattern 6: Environment-Specific Configuration

Use an environment enum to switch behavior.

from enum import Enum
from pydantic_settings import BaseSettings
from pydantic import Field, computed_field

class Environment(str, Enum):
    LOCAL = "local"
    STAGING = "staging"
    PRODUCTION = "production"

class Settings(BaseSettings):
    environment: Environment = Field(
        default=Environment.LOCAL,
        alias="ENVIRONMENT",
    )

    # Settings that vary by environment
    log_level: str = Field(default="DEBUG", alias="LOG_LEVEL")

    @computed_field
    @property
    def is_production(self) -> bool:
        return self.environment == Environment.PRODUCTION

    @computed_field
    @property
    def is_local(self) -> bool:
        return self.environment == Environment.LOCAL

# Usage
if settings.is_production:
    configure_production_logging()
else:
    configure_debug_logging()

Pattern 7: Nested Configuration Groups

Organize related settings into nested models.

from pydantic import BaseModel
from pydantic_settings import BaseSettings

class DatabaseSettings(BaseModel):
    host: str = "localhost"
    port: int = 5432
    name: str
    user: str
    password: str

class RedisSettings(BaseModel):
    url: str = "redis://localhost:6379"
    max_connections: int = 10

class Settings(BaseSettings):
    database: DatabaseSettings
    redis: RedisSettings
    debug: bool = False

    model_config = {
        "env_nested_delimiter": "__",
        "env_file": ".env",
    }

Environment variables use double underscore for nesting:

DATABASE__HOST=db.example.com
DATABASE__PORT=5432
DATABASE__NAME=myapp
DATABASE__USER=admin
DATABASE__PASSWORD=secret
REDIS__URL=redis://redis.example.com:6379

Pattern 8: Secrets from Files

For container environments, read secrets from mounted files.

from pydantic_settings import BaseSettings
from pydantic import Field
from pathlib import Path

class Settings(BaseSettings):
    # Read from environment variable or file
    db_password: str = Field(alias="DB_PASSWORD")

    model_config = {
        "secrets_dir": "/run/secrets",  # Docker secrets location
    }

Pydantic will look for /run/secrets/db_password if the env var isn't set.

Pattern 9: Configuration Validation

Add custom validation for complex requirements.

from pydantic_settings import BaseSettings
from pydantic import Field, model_validator

class Settings(BaseSettings):
    db_host: str = Field(alias="DB_HOST")
    db_port: int = Field(alias="DB_PORT")
    read_replica_host: str | None = Field(default=None, alias="READ_REPLICA_HOST")
    read_replica_port: int = Field(default=5432, alias="READ_REPLICA_PORT")

    @model_validator(mode="after")
    def validate_replica_settings(self):
        if self.read_replica_host and self.read_replica_port == self.db_port:
            if self.read_replica_host == self.db_host:
                raise ValueError(
                    "Read replica cannot be the same as primary database"
                )
        return self

Source: SKILL.md on GitHub

No alerts16d5 checks · Risk SAFE
  • Gen Agent Trust Hub16d

    This skill provides secure templates and best-practice patterns for managing Python application settings using Pydantic. It promotes the use of environment variables and structured validation while explicitly advising against hardcoding secrets. No malicious patterns or vulnerabilities were detected.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW · No issues

  • Runlayer7mo

    1/1 file flagged

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at be57c0b. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 3 days ago.

Activeupdated 4 months ago
  • Python
  • pydantic
  • pydantic-settings
  • configuration
  • environment-variables
  • secrets
  • validation
  • settings

README badge

README badge for wshobson/agents/python-configuration

Configures Python applications using environment variables and pydantic-settings for type-safe, validated settings. Use this skill when externalizing config, managing secrets, or setting up environment-specific behavior (dev/staging/prod) in Python projects.

Generated from the current SKILL.md.

Does this skill work with FastAPI or other frameworks?
Yes. The skill teaches pydantic-settings configuration patterns that work with any Python framework. The examples show integration patterns applicable to FastAPI, Django, or standalone applications.
Does this skill cover secrets management?
The skill covers externalizing secrets via environment variables and .env files, and mentions support for mounted secrets in containers. It does not cover third-party secret managers like AWS Secrets Manager or HashiCorp Vault.
Do I need pydantic v2?
The skill uses `pydantic-settings` and `pydantic.Field`, which require Pydantic v2. The `model_config` dictionary syntax shown is Pydantic v2 syntax.
What happens if a required environment variable is missing?
The skill teaches fail-fast validation: a ValidationError is caught at startup and prints a clear error message, then exits with code 1 rather than allowing the application to run with missing config.
Can I load config from .env files?
Yes. The skill shows how to use `model_config = {'env_file': '.env'}` to load variables from a .env file, and recommends adding it to .gitignore to avoid committing secrets.

Generated from the current SKILL.md. These answers refresh after source changes.