首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError: Params.my_params被认为是<class‘project’>,但是值{'host':'txt',‘Params.my_params’‘txt’‘,’roi_Params.my_params_id‘:123}是个白痴

TypeError: Params.my_params被认为是<class‘project’>,但是值{'host':'txt',‘Params.my_params’‘txt’‘,’roi_Params.my_params_id‘:123}是个白痴
EN

Stack Overflow用户
提问于 2022-07-21 13:20:15
回答 1查看 35关注 0票数 -1

目标:从.yaml读取参数,以便在运行时传递给函数。

我在网上没有看到这个错误,所以决定发个帖子。

我有一个用户定义的params.yaml

代码语言:javascript
复制
my_params:
  host: txt
  project: txt
  roi_term_id: 123

# ...

这是由params.py读取的。

代码语言:javascript
复制
import os
from dataclasses import dataclass
from pathlib import Path
import yaml
from decouple import config
from typed_json_dataclass import TypedJsonMixin


@dataclass
class MyParams(TypedJsonMixin):
    host: str
    project: str
    roi_term: str

    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__()

# ...
@dataclass
class Params(TypedJsonMixin):
    my_params: MyParams
    # ...


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:  # If this script is being called from the path directory
        params_path = cwd.parent / parameter_file
        params = yaml.safe_load(open(params_path))
    return params


params_dict = load_params_dict()
print(params_dict)
project_params = Params.from_dict(params_dict)

回溯:

代码语言:javascript
复制
  File "/home/me/miniconda3/envs/myvenv/lib/python3.7/site-packages/typed_json_dataclass/typed_json_dataclass.py", line 152, in __post_init__
    expected_type(**field_value)
TypeError: __init__() got an unexpected keyword argument 'roi_term_id'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "path/main.py", line 7, in <module>
    from params import project_params
  File "/home/me/PycharmProjects/project/path/params.py", line 89, in <module>
    project_params = Params.from_dict(params_dict)
  File "/home/me/miniconda3/envs/myvenv/lib/python3.7/site-packages/typed_json_dataclass/typed_json_dataclass.py", line 248, in from_dict
    return cls(**raw_dict)
  File "<string>", line 9, in __init__
  File "/home/me/miniconda3/envs/myvenv/lib/python3.7/site-packages/typed_json_dataclass/typed_json_dataclass.py", line 155, in __post_init__
    raise TypeError(f'{class_name}.{field_name} '
TypeError: Params.my_params is expected to be <class 'params.MyParams'>, but value {'host': 'txt', 'project': 'txt', 'roi_term_id': 123} is a dict with unexpected keys
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 12:40:06

2名称dtype

主题:

代码语言:javascript
复制
roi_term: str

名称:params.yaml中的名称必须与类中的属性的名称完全相同(我假定顺序)。

类中的属性表示str,但是当解析params.yaml文件时,它被认为是int --因为文件中的值是一个整数。在str类中,我将int改为了MyParams

因此,来自params.yamlparams.yaml与来自MyParams类的roi_term冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73067007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档