You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从YAML加载参数到TypedJsonMixin数据类时触发TypeError求助

解决YAML参数与数据类字段不匹配导致的实例化错误

你的报错由两个核心问题导致:

  • YAML配置中的键名roi_term_id与MyParams类定义的字段名roi_term不匹配
  • YAML中roi_term_id的值是整数123,但类中该字段类型定义为字符串str

以下是三种解决方案,可根据你的场景选择:

方案1:修改YAML配置匹配类定义

直接调整params.yaml的键名和值类型,让它完全符合MyParams的字段要求:

my_params:
  host: txt
  project: txt
  roi_term: "123"  # 键名改为roi_term,值用引号包裹成字符串

# ...

方案2:修改数据类适配YAML配置

如果无法修改配置文件,直接调整MyParams类的字段定义,适配YAML的键名和类型:

@dataclass
class MyParams(TypedJsonMixin):
    host: str
    project: str
    roi_term_id: int  # 字段名改为roi_term_id,类型改为int

    def __post_init__(self):
        self.public_key = config('KEY')
        assert isinstance(self.public_key, str)
        self.private_key = config('SECRET')
        assert isinstance(self.private_key, str)
        super().__post_init__()

方案3:加载参数时做映射转换

如果既不想修改类也不想改配置,可在加载参数后添加字段映射和类型转换逻辑:

def load_params_dict():
    parameter_file = 'params.yaml'
    cwd = Path(os.getcwd())
    params_path = cwd / parameter_file
    if params_path.exists():
        params = yaml.safe_load(open(params_path))
    else:
        params_path = cwd.parent / parameter_file
        params = yaml.safe_load(open(params_path))
    
    # 转换字段名并修改类型
    my_params = params['my_params']
    if 'roi_term_id' in my_params:
        # 将roi_term_id的整数值转为字符串,并重命名为roi_term
        my_params['roi_term'] = str(my_params.pop('roi_term_id'))
    
    return params

内容的提问来源于stack exchange,提问作者DanielBell99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:15:37