我想创建一个 config
dataclass
以简化特定环境变量的白名单和访问(键入 os.environ['VAR_NAME' ]
相对于 config.VAR_NAME
来说很乏味)。因此,我需要忽略 dataclass
的 __init__
函数中未使用的环境变量,但我不知道如何提取默认的 __init__
例如,为了将它包装成一个函数,该函数还包含 *_
作为参数之一。
import os
from dataclasses import dataclass
@dataclass
class Config:
VAR_NAME_1: str
VAR_NAME_2: str
config = Config(**os.environ)
运行它会给我 TypeError: __init__() got an unexpected keyword argument 'SOME_DEFAULT_ENV_VAR'
。
最佳答案
在将参数列表传递给构造函数之前清理参数列表可能是最好的方法。不过,我建议不要编写自己的 __init__
函数,因为数据类的 __init__
会做一些其他方便的事情,如果覆盖它,您会失去这些事情。
此外,由于参数清理逻辑与类的行为紧密绑定(bind)并返回一个实例,因此将其放入 classmethod
中可能有意义:
from dataclasses import dataclass
import inspect
@dataclass
class Config:
var_1: str
var_2: str
@classmethod
def from_dict(cls, env):
return cls(**{
k: v for k, v in env.items()
if k in inspect.signature(cls).parameters
})
# usage:
params = {'var_1': 'a', 'var_2': 'b', 'var_3': 'c'}
c = Config.from_dict(params) # works without raising a TypeError
print(c)
# prints: Config(var_1='a', var_2='b')
关于python - 如何忽略传递给数据类的额外参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54678337/