Cleaning the argument list before passing it to the constructor is probably the best way to go about it. I'd advice against writing your own __init__
function though, since the dataclass' __init__
does a couple of other convenient things that you'll lose by overwriting it.
Also, since the argument-cleaning logic is very tightly bound to the behavior of the class and returns an instance, it might make sense to put it into a 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')
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…