LoginSignup
1
5

More than 5 years have passed since last update.

Pythonでコマンドラインオプションの代わりにJSON形式の設定ファイルを読み込む

Posted at

はじめに

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形式の設定ファイルを書いておくことで,

  • 実行コマンドがシンプルになる(設定ファイルだけ受け取れば良い)
  • 一度書けば別のプログラムからも使いまわせる

といった利点があります。
また,実行時に出力先に設定ファイルもコピーするようにしておけば,後でどのような条件で実行したのかも分かります。

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5