はじめに
Pythonでコマンドライン引数を実行時に受け取りたい場合はArgumentParserが有用ですが,オプションが増えてきて一々入力するのが面倒という人にはJSONを利用するのが便利かもしれません。
方法
オプションをプログラム実行時にコマンドに記述する代わりにJSON形式の設定ファイルに書いておき,読み込んで利用します。
JSONとは?
Pythonの辞書型のような形でキーと値を記述するフォーマットのことです。
標準ライブラリがあるので簡単に読み込めます。
JSONの例:
setting.json
{
"learning_rate": 0.0001,
"optimizer": "Adam",
"batch-norm": true,
"data": ["data1.zip", "data2.zip"],
"network":{
"layer": "linear",
"activation": "relu"
}
}
使い方
json
モジュールをインポートすることで使用できます。
json.load()
で読み込むと辞書型のオブジェクトが返されるのでキーから参照して使います。
例:
import json
with open("setting.json","r") as f:
json_dict = json.load(f) # json.loadの引数はファイル名の文字列ではなくopenで得られるファイルオブジェクト
print(json_dict["learning_rate"])
print(json_dict["optimizer"])
print(json_dict["data"]) # リスト
print(json_dict["network"]) # 入れ子にもできる
小技
辞書形式で受け取れるので,プログラム内で利用する関数・メソッドの引数名とキーを合わせておけば,まとめてそのまま渡すこともできます。
例えば,以下のように定義された関数func
に渡す引数をJSONから指定したいとします。
def func(path, txt, x, y, z):
print(path, txt, x, y, z)
設定ファイルは次のようにします。
setting2.json
{
"func": {
"path": "/path/to/something",
"txt": "abcdefg",
"x": 1,
"y": true,
"z": ["あ", "い", "う"]
}
}
こうしておけば,次のようにfunc
を呼び出すことができます。
import json
with open("setting2.json", "r") as f:
setting = json.load(f)
# キーワード引数を利用してまとめて渡す
func(**setting["func"])
おわりに
JSON形式の設定ファイルを書いておくことで,
- 実行コマンドがシンプルになる(設定ファイルだけ受け取れば良い)
- 一度書けば別のプログラムからも使いまわせる
といった利点があります。
また,実行時に出力先に設定ファイルもコピーするようにしておけば,後でどのような条件で実行したのかも分かります。