如何为传递给另一个 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
被正确实例化。
使用 **
参数从根本上与静态类型提示的想法不一致。你是在说“我不知道,静态地,将提供什么参数。我会接受在 运行 时间给出的任何东西。”您将那些未知参数传递给 是 静态提示的函数这一事实并不重要。
我正在做一些机器学习,我有一个 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
被正确实例化。
使用 **
参数从根本上与静态类型提示的想法不一致。你是在说“我不知道,静态地,将提供什么参数。我会接受在 运行 时间给出的任何东西。”您将那些未知参数传递给 是 静态提示的函数这一事实并不重要。