I'd like to create a config
dataclass
in order to simplify whitelisting of and access to specific environment variables (typing os.environ['VAR_NAME']
is tedious relative to config.VAR_NAME
). I therefore need to ignore unused environment variables in my dataclass
's __init__
function, but I don't know how to extract the default __init__
in order to wrap it with, e.g., a function that also includes *_
as one of the arguments.
import os
from dataclasses import dataclass
@dataclass
class Config:
VAR_NAME_1: str
VAR_NAME_2: str
config = Config(**os.environ)
Running this gives me TypeError: __init__() got an unexpected keyword argument 'SOME_DEFAULT_ENV_VAR'
.
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')