从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
相关产品推荐
相关产品推荐

