プログラムのパラメータ値は実行時引数で設定することや外部のファイルで管理することが多いかと思います。
個人的には、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パターンを利用してプログラム内でインスタンスを一つにするのもありかもしれませんね。
@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で管理することが可能になります。
是非、参考にしてみてください!