python - 如何忽略传递给数据类的额外参数?

标签 python python-3.x python-dataclasses

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

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__ 会做一些其他方便的事情,如果覆盖它,您会失去这些事情。

此外,由于参数清理逻辑与类的行为紧密绑定(bind)并返回一个实例,因此将其放入 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')

关于python - 如何忽略传递给数据类的额外参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54678337/

相关文章:

python - 使用仅在运行时已知的字段名称更新数据类中的字段

python-3.x - 如何获取python3数据类实例的索引?

python - 类型错误 : __init__() got an unexpected keyword argument iam_api_key

django - 编写包装器以将现有 REST API 公开为 SOAP Web 服务?

Python:如何使用 .split 命令计算句子中的平均字长?

python-3.x - 如何在python中获取 Pandas 数据框的行列表?

python - 从python中的dict更新数据类字段

python - 如何使用 Python 可视化社交网络

python - Pandas .pivot_table : How to name functions for aggregation

python - celery、celerybeat 和 django-celery-beat 可以在运行时动态添加/删除任务而无需重新启动 celerybeat 吗?