我正面临着以下问题。我有一堆输入,需要编写一个函数来实例化几个需要这些输入的子集的对象(数据类实例)。
所以我得到了一些类似的东西:
def create_objects(**kwargs):
# as you can see some attrs are used in different objects.
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 for k, v in kwargs.items() if hasattr(Object1, k)})显然这是行不通的。有没有一种方法可以做到这一点呢?
还是有更好的方法?
发布于 2019-12-31 19:54:55
您可能想看看dacite library。
from dacite import from_dict
def create_objects(**kwargs):
obj1 = from_dict(data_class=Object1, data=kwargs)
obj2 = from_dict(data_class=Object2, data=kwargs)只要将Config.strict设置为False (这是默认选项),它就会自动忽略其他字典键。
发布于 2019-12-31 20:02:33
我目前实现的解决方案是下面的helper函数,在函数内部(kwargs在闭包中):
def get_kwargs_for_class(cls):
return {
k: v
for k, v in kwargs.items()
if k in [f.name for f in dataclasses.fields(cls)]
}这使我能够做到这一点:
obj1 = Class1(**get_kwargs_for_class(Class1))
obj2 = Class2(**get_kwargs_for_class(Class2))在我看来还不算太糟。
发布于 2019-12-31 20:36:17
一种解决方案是使用operator.itemgetter。
例如:
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')https://stackoverflow.com/questions/59543646
复制相似问题