Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在dataclass内解包kwargs_Python_Python Dataclasses - Fatal编程技术网

Python 在dataclass内解包kwargs

Python 在dataclass内解包kwargs,python,python-dataclasses,Python,Python Dataclasses,在创建没有问题的dataclass对象时,我可以使用kwargs: @dataclass() class Data: name: str = 'Unnamed' additional: int = None things: int = None dic = {'additional': 123, 'things': 456} res = Data(name='Somename', **dic) 但是,如果kwargs不是调用参数的一部

在创建没有问题的dataclass对象时,我可以使用
kwargs

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

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

但是,如果
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')

dataclass
可以显式定义
\uuuuu init\uuuu()
方法

各国:

dataclass()
的参数包括:

init
:如果为true(默认值),将生成一个
\uuuu init\uuuu()
方法

如果类已经定义了
\uuuu init\uuu()
,则忽略此参数。

因此,您可以定义一个标准的
\uuuu init\uuu()
方法来处理
kwargs

@dataclass()
类别数据:
姓名:str
附加:int
事物:int
def(self,name:str='Unnamed',addition:int=None,things:int=None,**kwargs):
对于键,kwargs.items()中的值:
setattr(自身、键、值)

我最终得到了一个略有不同的解决方案,实现了预期目标:

dic = {'Somename': 123}

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

    def __post_init__(self):
        self.arg = dic.get(self.name, None)

res = Data(name='Somename')


你为什么关心解包是在类内还是在类外完成的?你打算如何向你的
\uuuuu post\u init\uuuuuuu
提供
\uuuu init\uuuuu
调用的
dic
?@DeepSpace,因为该类将被调用很多次,并且是用用户键入的脚本语言指定的。@PatrickArtner它将从另一个类调用。然后您是否应该声明它们为dataclass.InitVar,如下所述:?
dic = {'Somename': 123}

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

    def __post_init__(self):
        self.arg = dic.get(self.name, None)

res = Data(name='Somename')
Data(name='Somename', additional=None, things=None, arg=123)