anyconfigによる設定ファイルの読み込み
Pythonプロジェクトにおいて、YAML、JSON、INI、TOMLといった多様な設定ファイル形式を統一的なインターフェースで扱えるのがanyconfigライブラリです。複数のファイルを自動的にマージしたり、ファイル形式を意識せずに辞書型としてデータを取得したりすることができます。
ファイルからの読み込み (load)
anyconfig.loadは、ファイルパス、ファイルパスのリスト、あるいはワイルドカードを使用したパス指定を受け取ります。
import anyconfig
# 単一のYAMLファイルを読み込む
app_settings = anyconfig.load("settings.yaml")
# 複数のファイルを読み込み、内容をマージする
# 後にあるファイルのキーが優先されます
files = ["defaults.json", "overrides.yaml"]
merged_config = anyconfig.load(files)
# globパターンを使用した読み込み
# フォルダ内のすべての.ymlファイルを一括で読み込む
wildcard_configs = anyconfig.load("/path/to/configs/*.yml")
文字列からのパース (loads)
設定内容が既に文字列として存在する場合は、loadsを使用してデシリアライズします。この際、ac_parserで形式を指定することが推奨されます。
raw_json_data = '{"database": {"host": "localhost", "port": 5432}}'
parsed_data = anyconfig.loads(raw_json_data, ac_parser="json")
設定の保存とシリアライズ
ファイルへの書き出し (dump)
Pythonの辞書オブジェクトを特定の設定ファイル形式で保存します。拡張子から自動的にフォーマットが判別されます。
export_data = {
"version": "1.0.0",
"features": ["auth", "logging"]
}
# JSON形式でファイルに保存
anyconfig.dump(export_data, "output_config.json")
文字列への変換 (dumps)
辞書オブジェクトを特定の形式の文字列に変換します。
yaml_string = anyconfig.dumps(export_data, ac_parser="yaml")
print(yaml_string)
ファイルオブジェクトの操作
anyconfig.openを使用すると、ファイルオブジェクトをラップして操作できます。これは、loadメソッドに直接渡すストリームとしても利用可能です。
with anyconfig.open("config.yml", mode="r") as config_file:
data = anyconfig.load(config_file)
辞書のマージ機能
anyconfig.mergeを使用すると、2つの辞書を再帰的にマージできます。デフォルトでは、第2引数の内容が第1引数の内容を上書き・統合します。
base_params = {
"retry": {
"count": 3,
"delay": 10
},
"enabled": True
}
custom_params = {
"retry": {
"delay": 20
},
"timeout": 30
}
anyconfig.merge(base_params, custom_params)
# base_paramsの中身が更新され、retry.delayは20になり、timeoutが追加される
バリデーションとスキーマ生成
設定ファイルの構造が正しいかを検証するために、JSON Schemaに基づいたバリデーションが可能です。
# 既存の設定からスキーマを自動生成
config_data = anyconfig.load("current_config.json")
generated_schema = anyconfig.gen_schema(config_data)
# 検証を実行 (有効であればTrueが返る)
is_valid, error_msg = anyconfig.validate(config_data, generated_schema)
サポートされている主要フォーマット
anyconfigは、依存ライブラリのインストール状況に応じて多くの形式をサポートします。
| フォーマット | 識別子 (Type) | 必要なライブラリ |
|---|---|---|
| JSON | json | 標準ライブラリ |
| INI | ini | configparser (標準) |
| YAML | yaml | PyYAML |
| TOML | toml | toml |
| XML | xml | lxml または ElementTree |
| MessagePack | msgpack | msgpack-python |