如何忽略传递给数据类的额外参数? [英] How does one ignore extra arguments passed to a data class?

查看:66
本文介绍了如何忽略传递给数据类的额外参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个config dataclass,以简化对特定环境变量的白名单和访问(键入os.environ['VAR_NAME']相对于config.VAR_NAME是乏味的).因此,我需要忽略dataclass__init__函数中未使用的环境变量,但是我不知道如何提取默认的__init__以便将其包装起来,例如,该函数还包含作为参数之一.

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)

运行此命令可以得到TypeError: __init__() got an unexpected keyword argument 'SOME_DEFAULT_ENV_VAR'.

推荐答案

我只提供一个明确的__init__而不是使用自动生成的__init__.循环主体仅设置可识别的值,而忽略意外的值.

I would just provide an explicit __init__ instead of using the autogenerated one. The body of the loop only sets recognized value, ignoring unexpected ones.

请注意,不过直到稍后,这都不会抱怨缺少默认值的情况.

Note that this won't complain about missing values without defaults until later, though.

@dataclass
class Config(init=False):
    VAR_NAME_1: str
    VAR_NAME_2: str

    def __init__(self, **kwargs):
        names = set([f.name for f in dataclasses.fields(self)])
        for k, v in kwargs.items():
            if k in names:
                setattr(self, k, v)

或者,您可以将经过过滤的环境传递给默认的Config.__init__.

Alternatively, you can pass a filtered environment to the default Config.__init__.

field_names = set(f.name for f in dataclasses.fields(Config))
c = Config({k:v for k,v in os.environ.items() if k in field_names})

这篇关于如何忽略传递给数据类的额外参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆