首页 > 解决方案 > 在数据类中解包 kwargs

问题描述

我可以kwargs在创建数据类对象时使用而不会出现问题:

@dataclass()
class Data:
    name: str =         'Unnamed'
    additional: int =   None
    things: int =       None

dic = {'additional': 123, 'things': 456}
res = Data(name='Somename', **dic)

Output: Data(name='Somename', additional=123, things=456)

kwargs但是,当它们不是调用参数的一部分时,我想解压缩数据类的内部:

@dataclass()
class Data:
    name: str =         'Unnamed'
    additional: int =   None
    things: int =       None

    def __post_init__(self):
        self(**dic) #unpack kwargs to fields

dic = {'additional': 123, 'things': 456}
res = Data(name='Somename')

标签: pythonpython-dataclasses

解决方案


Adataclass可以显式定义一个__init__()方法。

文档指出:

参数为dataclass()

init:如果为true(默认),__init__()将生成一个方法。

如果类已经定义__init__(),则忽略此参数。

因此,您可以定义一个标准__init__()方法来处理kwargs.

@dataclass()
class Data:
    name: str
    additional: int
    things: int

    def __init__(self, name: str = 'Unnamed', additional: int = None, things: int = None, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

推荐阅读