Pythonで深いネストのlistやDictの値を調べてDecimalがあればint or floatに変換する

DynamoDB使ってるとちょくちょくあるシチュエーションかなと思う。DynamoDBはDecimalだけどjsonになおす時にDecimalあると使えないし。

こういうロジック考えると地味に頭使うと思うんだけど、ChatGPTが1秒で考えてくれました。なんか軽く死にたい。しかも結局使わなかった😂

環境

  • Python 3.9

ロジック

以下、int, floatは何もせず、Decimalがあったらちゃんとint or floatにかえしてくれるやつ。

def _numeric_to_float_if_possible(value: Any) -> Any:
    if isinstance(value, (int, float)):
        return value
    elif isinstance(value, Decimal):
        if value % 1 == 0:
            return int(value)
        else:
            return float(value)
    elif isinstance(value, dict):
        return {k: _numeric_to_float_if_possible(v) for k, v in value.items()}
    elif isinstance(value, list):
        return [_numeric_to_float_if_possible(v) for v in value]
    else:
        return value

ChatGPTは僕よりプログラムがうまい。

jsonになおす時にどうにかしたいだけなら

json.dumps()でエラー出るの防ぎたいだけなんだよね、だったら下のほうが簡単にできる。

def decimal_default_proc(obj):
    if isinstance(obj, Decimal):
        if obj % 1 == 0:
            return int(obj)
        return float(obj)
    raise TypeError

print(json.dumps({...}, default=decimal_default_proc)

僕の用途だったらこれでよかった😂

参考にさせていただきました。

関連記事

aws の記事

Python の記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です