J'aimerais créer un config
_ _ _ dataclass
afin de simplifier la blanchissage et l'accès à des variables d'environnement spécifiques (dactylographie os.environ['VAR_NAME']
Est fastidieux par rapport à config.VAR_NAME
) . Il est donc nécessaire d'ignorer les variables d'environnement inutilisées dans ma fonction dataclass
's __init__
, Mais je ne sais pas comment extraire la valeur par défaut __init__
Pour l'envelopper avec, par exemple, Une fonction qui inclut également *_
comme l'un des arguments.
import os
from dataclasses import dataclass
@dataclass
class Config:
VAR_NAME_1: str
VAR_NAME_2: str
config = Config(**os.environ)
Exécution de cela me donne TypeError: __init__() got an unexpected keyword argument 'SOME_DEFAULT_ENV_VAR'
.
J'ai utilisé une combinaison de réponses; setattr
peut être un tueur de performance. Naturellement, si le dictionnaire n'aura pas des enregistrements dans la DataClass, vous devez définir les défaillances de champ pour eux.
from __future__ import annotations
from dataclasses import field, fields, dataclass
@dataclass()
class Record:
name: str
address: str
Zip: str = field(default=None) # won't fail if dictionary doesn't have a Zip key
@classmethod
def create_from_dict(cls, dict_) -> Record:
class_fields = {f.name for f in fields(cls)}
return Record(**{k: v for k, v in dict_.items() if k in class_fields})