Python 在dataclass内解包kwargs
在创建没有问题的dataclass对象时,我可以使用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不是调用参数的一部
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)