什么';从**kwargs实例化多个对象的Python方式是什么?

什么';从**kwargs实例化多个对象的Python方式是什么?,python,python-dataclasses,Python,Python Dataclasses,我面临以下问题。我有很多输入,需要编写一个函数来实例化几个需要这些输入子集的对象(数据类实例) 所以我有一些类似的东西: def创建_对象(**kwargs): #正如您所看到的,一些属性用于不同的对象。 obj1=Object1(attr1=kwargs.get(“attr1”),attr2=kwargs.get(“attr2”)) obj2=Object2(attr3=kwargs.get(“attr3”),attr2=kwargs.get(“attr2”)) 由于所有这些数据类都需要传递

我面临以下问题。我有很多输入,需要编写一个函数来实例化几个需要这些输入子集的对象(数据类实例)

所以我有一些类似的东西:

def创建_对象(**kwargs):
#正如您所看到的,一些属性用于不同的对象。
obj1=Object1(attr1=kwargs.get(“attr1”),attr2=kwargs.get(“attr2”))
obj2=Object2(attr3=kwargs.get(“attr3”),attr2=kwargs.get(“attr2”))
由于所有这些数据类都需要传递多个(介于2和10之间)属性,因此我想做一些类似魔术的事情,检查Object1类是否在数据类中定义了某个属性:

obj1=Object1(**{k:v代表k,v在kwargs.items()中,如果hasattr(Object1,k)})
显然这不起作用。有没有一种方法可以用肾盂法


还是有更好的方法

您可能想看一下


只要将
Config.strict
设置为默认选项
False
,它就会自动忽略其他字典键。

我实现的当前解决方案是函数内部的以下帮助函数(kwargs在闭包中):

这使我能够做到:

    obj1 = Class1(**get_kwargs_for_class(Class1))
    obj2 = Class2(**get_kwargs_for_class(Class2))
这对我来说还不算太糟

一个解决方案是使用

例如:

from operator import itemgetter
from dataclasses import dataclass

@dataclass
class Object1:
    name: str
    price: float

@dataclass
class Object2:
    name: str
    title: str

d = {'name':'some name', 'price': 42, 'title': 'some title'}

def create_objects(d):
    i1 = itemgetter(*Object1.__dataclass_fields__)
    i2 = itemgetter(*Object2.__dataclass_fields__)

    obj1 = Object1(*i1(d))
    obj2 = Object2(*i2(d))

    print(obj1)
    print(obj2)

create_objects(d)
印刷品:

Object1(name='some name', price=42)
Object2(name='some name', title='some title')

obj1和obj2是同一类的两个实例吗?这在很大程度上取决于上下文,以及
Object1
Object2
是什么类,它们是如何实现的,以及您对它们的了解程度。您可以使用
inspect.signature
来检查它们初始化时使用的参数,我以前在需要高灵活性的情况下做过这项工作,但它确实有一点代码味道。如果可以的话,我建议您首先尝试重构,除非这需要真正的动态重构。我现在正在尝试:
**{k:v代表k,v代表kwargs.items(),如果k代表[f.name代表f代表f代表dataclasses.fields(Object1)]}
,它似乎可以工作,但相当冗长。“还有更好的办法吗?”“没有,完全不同。这似乎是最好的解决办法。我不认为它过于冗长。如果您不想进行列表理解,可以使用
\uuuu dataclass\u fields\uuu
属性,但为了避免几个额外的单词,这似乎是不明智的<代码>**{k:v代表k,如果Object1中有k,则kwargs.items()中有v。_dataclass_fields__}感谢您的建议,但尝试限制对库的依赖性。。。
from operator import itemgetter
from dataclasses import dataclass

@dataclass
class Object1:
    name: str
    price: float

@dataclass
class Object2:
    name: str
    title: str

d = {'name':'some name', 'price': 42, 'title': 'some title'}

def create_objects(d):
    i1 = itemgetter(*Object1.__dataclass_fields__)
    i2 = itemgetter(*Object2.__dataclass_fields__)

    obj1 = Object1(*i1(d))
    obj2 = Object2(*i2(d))

    print(obj1)
    print(obj2)

create_objects(d)
Object1(name='some name', price=42)
Object2(name='some name', title='some title')