Pythonで設定ファイルから動的パラメータを読み込む方法

設定ファイルから動的パラメータへの移行

実際の開発において、アプリケーションを構成するために設定ファイルからパラメータを読み込むことは一般的です。しかし、状況によっては設定ファイルを修正する代わりに動的にパラメータを渡したい場合があります。この記事では、Pythonを使用して動的パラメータ読み込みを実装する方法を紹介します。

静的設定ファイルの読み込み

まず、設定ファイルからパラメータを読み込む基本的な方法を見てみましょう。通常、Pythonの標準ライブラリであるconfigparserモジュールが使用されます。以下は設定ファイルsettings.iniの例です:

[application]
debug_mode = true
max_connections = 100
timeout = 30

対応するPythonコードは以下の通りです:

import configparser

def load_config(file_path):
    config_parser = configparser.ConfigParser()
    config_parser.read(file_path)
    
    settings = {}
    for section in config_parser.sections():
        settings[section] = {}
        for key, value in config_parser.items(section):
            settings[section][key] = value
    
    return settings

config_data = load_config('settings.ini')
print(config_data['application']['debug_mode'])

上記のコードはconfigparserを使用して設定ファイルからパラメータを読み込み、辞書形式で保存しています。

動的パラメータの受け取り

動的にパラメータを渡すには、コマンドライン引数や環境変数を使用できます。コマンドライン引数を使用した例を以下に示します:

import argparse

def parse_arguments():
    parser = argparse.ArgumentParser(description='アプリケーション設定')
    
    parser.add_argument('--debug', type=bool, default=False,
                       help='デバッグモオンの有無')
    parser.add_argument('--connections', type=int, default=50,
                       help='最大接続数')
    parser.add_argument('--timeout', type=int, default=15,
                       help='タイムアウト時間(秒)')
    
    return parser.parse_args()

args = parse_arguments()
print(f"デバッグモード: {args.debug}")
print(f"最大接続数: {args.connections}")
print(f"タイムアウト: {args.timeout}")

この例では、argparseモジュールを使用してコマンドライン引数を解析しています。これにより、プログラム実行時に動的にパラメータを指定できます。

統合的なアプローチ

以下は、設定ファイルと動的パラメータの両方をサポートする統合的な例です:

import configparser
import argparse
import os
from typing import Dict, Any

class ParameterManager:
    def __init__(self, config_file: str = None):
        self.config_file = config_file
        self.config_data = {}
        self.cli_args = {}
        
    def load_config(self) -> Dict[str, Any]:
        """設定ファイルからパラメータを読み込む"""
        if self.config_file and os.path.exists(self.config_file):
            config_parser = configparser.ConfigParser()
            config_parser.read(self.config_file)
            
            for section in config_parser.sections():
                self.config_data[section] = {}
                for key, value in config_parser.items(section):
                    # 値の型を自動変換
                    try:
                        self.config_data[section][key] = int(value)
                    except ValueError:
                        try:
                            self.config_data[section][key] = float(value)
                        except ValueError:
                            if value.lower() in ('true', 'false'):
                                self.config_data[section][key] = value.lower() == 'true'
                            else:
                                self.config_data[section][key] = value
        return self.config_data
    
    def parse_cli_args(self) -> Dict[str, Any]:
        """コマンドライン引数を解析する"""
        parser = argparse.ArgumentParser()
        
        # 基本的な引数を定義
        parser.add_argument('--env', choices=['dev', 'staging', 'prod'], 
                          default='dev', help='実行環境')
        parser.add_argument('--log-level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
                          default='INFO', help='ログレベル')
        
        args = parser.parse_args()
        
        # 引数を辞書に変換
        for key, value in vars(args).items():
            self.cli_args[key] = value
            
        return self.cli_args
    
    def get_parameter(self, section: str, key: str, default=None):
        """パラメータを取得(CLI引数が優先)"""
        # CLI引数を先にチェック
        if key in self.cli_args:
            return self.cli_args[key]
            
        # 次に設定ファイルをチェック
        if section in self.config_data and key in self.config_data[section]:
            return self.config_data[section][key]
            
        # デフォルト値を返す
        return default

# 使用例
if __name__ == "__main__":
    param_manager = ParameterManager('settings.ini')
    param_manager.load_config()
    param_manager.parse_cli_args()
    
    # パラメータの取得
    debug_mode = param_manager.get_parameter('application', 'debug_mode', False)
    max_connections = param_manager.get_parameter('application', 'max_connections', 50)
    env = param_manager.get_parameter('env', 'dev')
    
    print(f"デバッグモード: {debug_mode}")
    print(f"最大接続数: {max_connections}")
    print(f"実行環境: {env}")

このParameterManagerクラスは、設定ファイルとコマンドライン引数の両方からパラメータを読み込み、コマンドライン引数を優先して値を返します。これにより、柔軟なパラメータ管理が可能になります。

ベストプラクティス

  • 環境変数を使用して機密情報を管理する
  • デフォルト値を適切に設定する
  • パラメータの型を明確にする
  • 設定ファイルの形式を標準化する(JSONやYAMLも検討)

このアプローチにより、設定ファイルと動的パラメータの両方を柔軟に扱うことができ、アプリケーションの保守性と柔軟性が向上します。

タグ: Python configparser argparse 設定ファイル 動的パラメータ

6月1日 09:48 投稿