在数据类中解压 kwargs

mis*_*oop 2 python python-dataclasses

kwargs我可以在创建数据类对象时使用,没有问题:

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

dic = {'additional': 123, 'things': 456}
res = Data(name='Somename', **dic)
Run Code Online (Sandbox Code Playgroud)
Output: Data(name='Somename', additional=123, things=456)
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

Chr*_*ert 8

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)
Run Code Online (Sandbox Code Playgroud)