1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】argparseに渡された引数をjsonで出力したい!

Posted at

やりたいこと

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 の対処法

いずれかのどれかで対処可能

  1. objectをstr型に変換する
  2. 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で出力するくらいすぐできるやろーとなめてましたが、少しめんどくさかったのでメモを残しました。
いつか誰かの役に立つと嬉しいです。

1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?