🐍 Python
NaN / Infinity という非標準の特殊値
正式なJSON仕様(RFC 8259)にはNaNやInfinityという値は存在しません。しかしPython標準のjsonモジュールは、既定でこれらを独自拡張として出力・読み込みできてしまいます。他言語・他システムとの連携では注意が必要な仕様です。
json.dumps(float("nan")) # "NaN"という非標準の文字列を出力(既定)
json.dumps(float("nan"), allow_nan=False) # 出力時にValueErrorにする
import json
print(json.dumps(float("nan")))
# NaN
print(json.dumps(float("inf")))
# Infinity
print(json.dumps(float("-inf")))
# -Infinity
# 読み込み側もNaN/Infinityを特別扱いして受け入れる(既定)
import json
print(json.loads("NaN"))
# nan
print(json.loads("Infinity"))
# inf
# allow_nan=Falseにすると、出力時にValueErrorになる
import json
try:
json.dumps(float("nan"), allow_nan=False)
except ValueError as e:
print("ValueError:", e)
# ValueError: Out of range float values are not JSON compliant: nan
allow_nan引数
True(既定)NaN/Infinity/-Infinityという非標準の値を許可し、そのまま出力するFalse- これらの値が含まれていると
ValueErrorを送出し、厳密なJSON仕様に従った出力しか許さない
💡 AIコードレビュー観点:他言語のJSONパーサーはNaN/Infinityを読めないことがある
Pythonのjsonモジュールが出力したNaNやInfinityを含むJSON文字列は、標準に厳密な他言語(JavaScriptのJSON.parseなど多くの実装)では構文エラーとして拒否されることがあります。AIが生成したコードで計算結果にnan/infが混入する可能性がある値(0除算やオーバーフローの結果など)をそのままjson.dumps()している場合、他システムとの連携で予期しないエラーの原因になります。他システムに渡す前にallow_nan=Falseで早期に検出するか、Noneに置き換えるなどの対策を検討しましょう。