Pythonで実行時パラメータを外部ファイルで持つ方法

Pythonで実行時パラメータを外部ファイルで持つ方法

プログラムのパラメータ値は実行時引数で設定することや外部のファイルで管理することが多いかと思います。

個人的には、Gitでの管理もしやすいことから外部ファイル(yaml)でパラメータをよく管理しています。

この記事では、Pythonでのプログラムのパラメータ値をyamlで持つ方法を紹介します。

プログラムの規模次第では実行時引数のほうが楽ですよね。個人的には、Gitで管理するレベルのプログラムでは外部ファイル化がおすすめです!

パラメータ値をyamlファイルに定義

プログラムの中で利用するパラメータ値をyamlファイルに指定します。

yamlの書き方はこちらを参考にしてください(YAML構文)。

general:
  field_str: 'hoge'
  field_int: 1
  field_list:
  - 'a'
  - 'b'
  - 'c'

yamlファイルを読み込むPythonプログラム

上記yamlを読み込んで利用するクラスを定義します。

import yaml


class Config:
    def __init__(self) -> None:
        with open('config.yaml', 'r') as f:
            self._config = yaml.safe_load(f)

    @property
    def general(self):
        return self._config['general']

    @property
    def field_str(self):
        return self.general['field_str']
    
    @property
    def field_int(self):
        return self.general['field_int']
    
    @property
    def field_list(self):
        return self.general['field_list']

conf = Config()
print('=== All')
print(conf.general)

print('=== fileds')
print(conf.field_str)
print(conf.field_int)
print(conf.field_list)

特にポイントというほどでもないですが、propertyデコレータを利用することで、簡単に変数にアクセスを可能にしています。

今回は普通のクラスを利用していますが、Singletonパターンを利用してプログラム内でインスタンスを一つにするのもありかもしれませんね。

PythonでSingleton PythonでSingletonクラスを実装!継承して利用する方法
properyデコレータ

@propertyは、関数を定義することなくインスタンス変数を直接参照できるようになるデコレータです。

getter関数のようなもので、インスタンス変数に対して安全に簡単にアクセスすることが可能となります。

出力結果

ちなみに、上記プログラムを実行すると得られる出力は下記の通りです。

$ python config.py
=== All
{'field_str': 'hoge', 'field_int': 1, 'field_list': ['a', 'b', 'c']}

=== fileds
hoge
1
['a', 'b', 'c']

yamlを読み込むとdict型で返ってきていることが確認できます。

dict型なので、値へのアクセスはキーを指定するだけです。

import yamlでエラーが出た場合

ModuleNotFoundError: No module named 'yaml'のエラーが出た場合、pyyamlパッケージをインストールします。

pip install pyyaml

これでimport yamlでエラーは出なくなります

まとめ

Pythonでプログラムのパラメータ値を外部ファイル(yaml)で管理し、それを読み込む方法を紹介しました。

外部ファイル化することで、実行時のパラメータをGitで管理することが可能になります。

是非、参考にしてみてください!