如何为传递给另一个 class 的 kwargs 添加类型提示而不需要复制我的提示 and/or 文档?

How can I add type hints for kwargs that are passed to another class without needing to duplicate my hints and/or docs?

我正在做一些机器学习,我有一个 Generator class 可以生成文本并且可以使用多个模型来生成文本。我使用 Pydantic Model 来验证它的参数,并给我一个类型提示对象,它在整个代码中都很容易使用。

问题是我希望能够在 Generator class 中有一个 add_params 方法,它的类型提示就像 pydantic 模型一样。但要做到这一点,我必须在 add_params 方法中手动记下类型提示。这似乎是灾难的根源,因为我很可能会更改 pydantic 模型的类型提示和文档而忘记更改 add_params 方法,反之亦然。

现在,我只是在 add_params 使用 kwargs 并在需要记住我可以通过的内容时参考 pydantic 模型。但我希望有更好的方法。

class GenerationParameters(pydantic.BaseModel):
    # list of all possible parameters and types
    # and some validation methods


class Generator:
    param_list:List[GenerationParameters] = []

    def add_params(model_name:str, **kwargs):
        # load default params for that model
        params_dict = get_default_params_from_model_name(model_name:str)
        # overwrite defaults with passed kwargs
        params_dict.update(kwargs)
        # pass to pydantic model for validation and easy access
        pydantic_params = GenerationParameters(model_name=model_name, **params_dict)
        # add to params list
        self.params_list.append(pydantic_params )
               
    def generate():
        output = []
        for params in param_list:
            output.append(self._generate_from_params(params))
        return output

有没有办法为 add_params kwargs 使用 GenerationParameters 的类型提示?或者是否有更好的方法来组合这些类型提示和文档?

不要让 Generator.add_params 负责构造 GenerationParameters 的实例。让调用者构造它并将其传递给方法,该方法现在只需要存储它以备后用。

class GenerationParameters(pydantic.BaseModel):
    # list of all possible parameters and types
    # and some validation methods


class Generator:
    param_list:List[GenerationParameters] = []

    def add_params(gp: GenerationParameters):
        self.params_list.append(gp)
          
    def generate(self):
        output = []
        for params in param_list:
            output.append(self._generate_from_params(params))
        return output


g = Generator()
g.add_params(GenerationParameters('model1', foo=3, bar=6))

get_default_params_from_model_name应该被GenerationParameters的方法使用来帮助构建实例。

现在 Generator 没有责任确保 GenerationParameters 被正确实例化。


使用 ** 参数从根本上与静态类型提示的想法不一致。你是在说“我不知道,静态地,将提供什么参数。我会接受在 运行 时间给出的任何东西。”您将那些未知参数传递给 静态提示的函数这一事实并不重要。