如何修改ModelResult数据类自动替换inf为JSON合法可序列化数值
解决方案
我们可以使用dataclass内置的__post_init__钩子方法,在实例初始化完成后自动遍历替换所有无穷值,无需修改上层调用逻辑。
修改后的ModelResult代码
from dataclasses import dataclass import numpy as np import sys @dataclass class ModelResult: scorecard_calcs: dict def __post_init__(self): # 递归遍历处理嵌套结构中的无穷值 def replace_inf_val(value): if isinstance(value, dict): return {k: replace_inf_val(v) for k, v in value.items()} elif isinstance(value, list): return [replace_inf_val(item) for item in value] elif value == np.inf: # sys.float_info.max 就是你需要的 1.7976931348623157e+308 return sys.float_info.max elif value == -np.inf: return -sys.float_info.max return value self.scorecard_calcs = replace_inf_val(self.scorecard_calcs)
说明
__post_init__方法会在ModelResult实例构造完成后自动执行,不需要额外调用- 内置的递归函数支持处理任意嵌套层级的字典、列表结构,适配不同格式的
scorecard_calcs - 不需要修改原有的
Model类逻辑,返回的实例可以直接转换为合法JSON格式
内容的提问来源于stack exchange,提问作者PalimPalim
相关产品推荐
相关产品推荐

