やりたいこと
args = parser.argparse()
で渡された引数をjson形式で保存する。
やりかた
以下 [ 参考記事 ] より引用
main.py
import json
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--param1", type=str, default="test")
parser.add_argument("--param2", type=int, default=100)
parser.add_argument("--param3", type=float, nargs="+", default=[0.1, 0.2, 0.3])
args = parser.parse_args()
with open("./params.json", mode="w") as f:
json.dump(args.__dict__, f, indent=4)
out.json
{
"param1": "test",
"param2": 100,
"param3": [
0.1,
0.2,
0.3
]
}
基本的には上記でできる。
しかし、json出力時にserializeできない型が含まれているとエラーを吐く。
例:TypeError: Object of type PosixPath is not JSON serializable
上記の例は引数にserializeできないPosixPath型が含まれていたために起きたもの。
TypeError: Object of type xxxx is not JSON serializable の対処法
いずれかのどれかで対処可能
- objectをstr型に変換する
- dump時にdefaultまたはclsを指定することでエンコード方式を指定する
前者はそのまんまです。試してはいないですができるはず。
後者のdump時の指定は以下のように行えます。
今回はPosixPath型への対応策例を記載しますが、ほかの方でも同様に行うことができます。
[ 参考記事 ]
dump時にdefaultで指定する方法
from pathlib import Path
def json_encode(obj):
if isinstance(obj, Path):
return obj.as_posix()
with open("dumped.json", "w") as f:
json.dump(data, f, default=json_encode)
dumpできないobjectが来たらdumpできるように変換したものに変換する関数を準備すればOK!という話です。
dump時にclsで指定する方法
from pathlib import Path
class JSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Path):
return obj.as_posix()
with open("dumped.json", "w") as f:
json.dump(data, f, cls=JSONEncoder)
dumpできないobjectが来たらdumpできるように変換したものに変換する関数を持ったクラスを準備すればOK!という話です。
まとめ
jsonで出力するくらいすぐできるやろーとなめてましたが、少しめんどくさかったのでメモを残しました。
いつか誰かの役に立つと嬉しいです。