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)
僕の用途だったらこれでよかった😂
参考にさせていただきました。
コメント