最初のステップは設定ファイルのフォーマットを選択することです: INI、JSON、YAML、TOML。
プログラムには十分な数の引数が必要な場合があり、それらをすべてコマンドライン引数や環境変数として使用するのは快適でも実現可能でもありません。 このような場合、設定ファイルを使う必要があります。
人気のある設定ファイルフォーマットはいくつかあります。由緒あるINIフォーマット、人気があるが手で書くのが難しいこともあるJSONフォーマット、広く使われているが時々驚くほど詳細なYAMLフォーマット、そして多くの人がまだ聞いたことがない新しく登場したTOMLなどです。
最初の仕事は、フォーマットを選択し、その選択を文書化することです。この簡単な部分を解決した後は、コンフィギュレーションを解析する番です。
コンフィギュレーションに「抽象」データに対応するクラスを用意するのはいいアイデアかもしれません。このコードはコンフィギュレーションに対して何もしないので、パースロジックを示す最も簡単な方法です。
ファイルプロセッサーの構成を想像してください:入力ディレクトリ、出力ディレクトリ、抽出されるファイルで構成されています。
コンフィギュレーション・クラスの抽象的な定義も似たようなものでしょう:
from __future__ import annotations
import attr@attr.frozenclass Configuration:@attr.frozenclass Files:input_dir: stroutput_dir: strfiles: Files@attr.frozenclass Parameters:patterns: List[str]parameters: Parameters
フォーマット固有のコードを簡単にするために、辞書からそのようなものを解析する関数も書く必要があります。これは、コンフィギュレーションがアンダースコアではなくダッシュを使うことを想定していることに注意してください。 この違いは珍しいことではありません。
def configuration_from_dict(details):files = Configuration.Files(input_dir=details["files"]["input-dir"],output_dir=details["files"]["output-dir"],parameters = Configuration.Paraneters(patterns=details["parameters"]["patterns"]return Configuration(files=files,parameters=parameters,
JSON
JSONはJavaScriptに似たフォーマットです。
以下はJSON形式の設定サンプルです:
json_config = """"files": {"input-dir": "inputs","output-dir": "outputs""parameters": {"patterns": ["*.txt","*.md"
解析ロジックは json モジュールを使って JSON を Python 組み込みのデータ構造に解析し、辞書からクラスを作成します:
import jsondef configuration_from_json(data):parsed = json.loads(data)return configuration_from_dict(parsed)
INI
INI フォーマットは、当初 Windows でのみ使用されていましたが、現在では設定の標準となっています。
これはINIと同じ設定です:
ini_config="""[files]input-dir = inputsoutput-dir = outputs[parameters]patterns = ['*.txt', '*.md']
Pythonは組み込みのconfigparserモジュールを使ってそれを解析できます。パーサはディクテのようなオブジェクトとして動作するので、直接 configuration_from_dictに渡すことができます:
import configparserdef configuration_from_ini(data):parser = configparser.ConfigParser()parser.read_string(data)return configuration_from_dict(parser)
YAML
YAMLはJSONを拡張したもので、手作業で書きやすいように設計されています。これは、部分的には、非常に長い仕様を持つことで達成されました。
同じ設定をYAMLで示します:
yaml_config = """input-dir: inputsoutput-dir: outputsparameters:patterns:- '*.txt'- '*.md'
Python に YAML を解析させるには、サードパーティのモジュールをインストールする必要があります。YAMLパーサーは configuration_from_dict 渡すことができる組み込みのPythonデータ型も返します。しかし、YAMLパーサーはバイトストリームを必要とするので、文字列をバイトストリームに変換する必要があります。
import ioimport yamldef configuration_from_yaml(data):fp = io.StringIO(data)parsed = yaml.safe_load(fp)return configuration_from_dict(parsed)
TOML
TOMLはYAMLの軽量な代替となることを意図しています。その仕様はより短く、すでにいくつかの場所で人気があります。
これはTOMLと同じ設定です:
toml_config = """[files]input-dir = "inputs"output-dir = "outputs"[parameters]patterns = [ "*.txt", "*.md",]
TOML をパースするには、サードパーティのパッケージをインストールする必要があります。YAMLやJSONのように、基本的なPythonデータ型を返します。
import tomldef configuration_from_toml(data):parsed = toml.loads(data)return configuration_from_dict(parsed)
まとめ
設定フォーマットの選択は微妙なトレードオフです。しかし、一度決めたら、Python は少量のコードでほとんどの一般的なフォーマットを解析できます。





