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
ベストプラクティスまとめ
- 設定をハードコードしない - 環境固有のすべての値を env vars から取得
- 型付き設定を使用 - 検証機能付き pydantic-settings
- フェイルファストを実装 - 起動時に欠落した必須設定でクラッシュ
- 開発用デフォルトを提供 - ローカル開発を簡単に
- シークレットをコミットしない -
.envファイル(gitignore化)またはシークレットマネージャーを使用 - 変数に名前空間を付ける - 明確さのために
DB_HOST、REDIS_URLなど - 設定シングルトンをインポート - コード全体で
os.getenv()を呼び出さない - すべての変数を文書化 - README に必須 env vars をリストアップ
- 早期に検証 - 起動時に設定の正確性をチェック
- secrets_dir を使用 - コンテナにマウントされたシークレットをサポート
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- wshobson
- リポジトリ
- wshobson/agents
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/wshobson/agents / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。