Очистка списка аргументов перед передачей его конструктору, вероятно, лучший способ сделать это.Однако я бы не советовал писать собственную функцию __init__
, так как класс данных '__init__
делает пару других удобных вещей, которые вы потеряете, переписав его.
Кроме того, поскольку очистка аргументовлогика очень тесно связана с поведением класса и возвращает экземпляр, возможно, имеет смысл поместить его в classmethod
:
from dataclasses import dataclass
from 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')