从**kwargs实例化多个对象的pythonic方法是什么?

2024-04-26 10:09:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以我有这样的想法:

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)})

显然这不管用。有没有一种方法可以用肾盂法?你知道吗

还是有更好的办法?你知道吗


Tags: 数据对象实例函数inget属性objects
3条回答

一种解决方案是使用^{}。你知道吗

例如:

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')

我实现的当前解决方案是以下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))

在我看来还不错。你知道吗

您可能想看看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(这是默认选项),它就会自动忽略其他字典键。你知道吗

相关问题 更多 >