web-dev-qa-db-fra.com

Comment ignorer les arguments supplémentaires sont-ils passés à une classe de données?

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'.

14
Californian

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})
0
Doug