Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

python-configuration

環境変数と型付き設定によるPythonの設定管理を行います。設定の外部化、pydantic-settingsのセットアップ、シークレットの管理、または環境ごとの動作の実装が必要な場合に使用してください。

description の原文を見る

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

SKILL.md 本文

Python 設定管理

環境変数と型付き設定を使用して、設定をコードから外部化します。適切に管理された設定により、同じコードを修正なしに任意の環境で実行できます。

このスキルをいつ使用するか

  • 新しいプロジェクトの設定システムをセットアップする
  • ハードコードされた値から環境変数への移行
  • pydantic-settings を使用した型付き設定の実装
  • シークレットと機密値の管理
  • 環境別設定(dev/staging/prod)の作成
  • アプリケーション起動時の設定検証

コア概念

1. 外部化された設定

環境固有のすべての値(URL、シークレット、フィーチャーフラグ)は、コードではなく環境変数から取得します。

2. 型付き設定

起動時に設定を型付きオブジェクトにパースして検証し、コード全体に散在させません。

3. フェイルファスト

すべての必須設定をアプリケーション起動時に検証します。設定が欠けている場合は、明確なメッセージとともに即座にクラッシュすべきです。

4. 合理的なデフォルト

ローカル開発用に合理的なデフォルト値を提供しながら、機密設定には明示的な値を要求します。

クイックスタート

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()  # 環境変数から読み込む

基本的なパターン

パターン 1: Pydantic を使用した型付き設定

すべての設定を読み込み、検証する中央の設定クラスを作成します。

from pydantic_settings import BaseSettings
from pydantic import Field, PostgresDsn, ValidationError
import sys

class Settings(BaseSettings):
    """環境変数から読み込まれるアプリケーション設定。"""

    # データベース
    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 キー
    api_secret_key: str = Field(alias="API_SECRET_KEY")

    # フィーチャーフラグ
    enable_new_feature: bool = Field(default=False, alias="ENABLE_NEW_FEATURE")

    model_config = {
        "env_file": ".env",
        "env_file_encoding": "utf-8",
    }

# モジュール読み込み時にシングルトンインスタンスを作成
try:
    settings = Settings()
except ValidationError as e:
    print(f"Configuration error:\n{e}")
    sys.exit(1)

アプリケーション全体で settings をインポートします:

from myapp.config import settings

def get_database_connection():
    return connect(
        host=settings.db_host,
        port=settings.db_port,
        database=settings.db_name,
    )

パターン 2: 欠落した設定でフェイルファスト

必須設定がない場合、アプリケーションは明確なエラーメッセージとともに即座にクラッシュすべきです。

from pydantic_settings import BaseSettings
from pydantic import Field, ValidationError
import sys

class Settings(BaseSettings):
    # 必須 - デフォルトがない場合は設定が必要
    api_key: str = Field(alias="API_KEY")
    database_url: str = Field(alias="DATABASE_URL")

    # デフォルト付きの任意項目
    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)

起動時の明確なエラーは、リクエスト途中の不可解な None エラーより優れています。

パターン 3: ローカル開発用デフォルト

ローカル開発用に合理的なデフォルト値を提供しながら、シークレットには明示的な値を要求します。

class Settings(BaseSettings):
    # ローカルデフォルトを持つが、本番環境では上書きされる
    db_host: str = Field(default="localhost", alias="DB_HOST")
    db_port: int = Field(default=5432, alias="DB_PORT")

    # 常に必須 - シークレットのためのデフォルトなし
    db_password: str = Field(alias="DB_PASSWORD")
    api_secret_key: str = Field(alias="API_SECRET_KEY")

    # 開発の利便性
    debug: bool = Field(default=False, alias="DEBUG")

    model_config = {"env_file": ".env"}

ローカル開発用に .env ファイルを作成します(コミットしないこと):

# .env (add to .gitignore)
DB_PASSWORD=local_dev_password
API_SECRET_KEY=dev-secret-key
DEBUG=true

パターン 4: 名前空間付き環境変数

関連する変数に接頭辞を付けて、明確さとデバッグを簡単にします。

# データベース設定
DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp
DB_USER=admin
DB_PASSWORD=secret

# Redis 設定
REDIS_URL=redis://localhost:6379
REDIS_MAX_CONNECTIONS=10

# 認証
AUTH_SECRET_KEY=your-secret-key
AUTH_TOKEN_EXPIRY_SECONDS=3600
AUTH_ALGORITHM=HS256

# フィーチャーフラグ
FEATURE_NEW_CHECKOUT=true
FEATURE_BETA_UI=false

env | grep DB_ はデバッグに役立ちます。

高度なパターン

パターン 5: 型強制

Pydantic は一般的な変換を自動的に処理します。

from pydantic_settings import BaseSettings
from pydantic import Field, field_validator

class Settings(BaseSettings):
    # "true"、"1"、"yes" を自動的に True に変換
    debug: bool = False

    # 文字列を自動的に int に変換
    max_connections: int = 100

    # コンマ区切り文字列をリストにパース
    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

使用例:

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

パターン 6: 環境別設定

環境 enum を使用して動作を切り替えます。

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",
    )

    # 環境によって異なる設定
    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

# 使用例
if settings.is_production:
    configure_production_logging()
else:
    configure_debug_logging()

パターン 7: ネストされた設定グループ

関連する設定をネストされたモデルに整理します。

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",
    }

環境変数はネストに二重アンダースコアを使用します:

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

パターン 8: ファイルからのシークレット

コンテナ環境では、マウントされたファイルからシークレットを読み取ります。

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

class Settings(BaseSettings):
    # 環境変数またはファイルから読み取る
    db_password: str = Field(alias="DB_PASSWORD")

    model_config = {
        "secrets_dir": "/run/secrets",  # Docker シークレット location
    }

Pydantic は、env var が設定されていない場合、/run/secrets/db_password を探します。

パターン 9: 設定検証

複雑な要件のためにカスタム検証を追加します。

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

ベストプラクティスまとめ

  1. 設定をハードコードしない - 環境固有のすべての値を env vars から取得
  2. 型付き設定を使用 - 検証機能付き pydantic-settings
  3. フェイルファストを実装 - 起動時に欠落した必須設定でクラッシュ
  4. 開発用デフォルトを提供 - ローカル開発を簡単に
  5. シークレットをコミットしない - .env ファイル(gitignore化)またはシークレットマネージャーを使用
  6. 変数に名前空間を付ける - 明確さのために DB_HOSTREDIS_URL など
  7. 設定シングルトンをインポート - コード全体で os.getenv() を呼び出さない
  8. すべての変数を文書化 - README に必須 env vars をリストアップ
  9. 早期に検証 - 起動時に設定の正確性をチェック
  10. secrets_dir を使用 - コンテナにマウントされたシークレットをサポート

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
wshobson
リポジトリ
wshobson/agents
ライセンス
MIT
最終更新
不明

Source: https://github.com/wshobson/agents / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: wshobson · wshobson/agents · ライセンス: MIT