How does one ignore extra arguments passed to a data class?

后端 未结 3 1318
南旧
南旧 2020-12-11 01:37

I\'d like to create a config dataclass in order to simplify whitelisting of and access to specific environment variables (typing os.environ[\

3条回答
  •  长情又很酷
    2020-12-11 02:12

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

提交回复
热议问题