首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从**kwargs实例化多个对象的pythonic方法是什么?

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

Stack Overflow用户
提问于 2019-12-31 19:38:53
回答 3查看 142关注 0票数 3

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

所以我得到了一些类似的东西:

代码语言:javascript
复制
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类是否在数据类中定义了某个属性:

代码语言:javascript
复制
    obj1 = Object1(**{k: v for k, v in kwargs.items() if hasattr(Object1, k)})

显然这是行不通的。有没有一种方法可以做到这一点呢?

还是有更好的方法?

EN

回答 3

Stack Overflow用户

发布于 2019-12-31 19:54:55

您可能想看看dacite library

代码语言:javascript
复制
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 (这是默认选项),它就会自动忽略其他字典键。

票数 2
EN

Stack Overflow用户

发布于 2019-12-31 20:02:33

我目前实现的解决方案是下面的helper函数,在函数内部(kwargs在闭包中):

代码语言:javascript
复制
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)]
    }

这使我能够做到这一点:

代码语言:javascript
复制
    obj1 = Class1(**get_kwargs_for_class(Class1))
    obj2 = Class2(**get_kwargs_for_class(Class2))

在我看来还不算太糟。

票数 1
EN

Stack Overflow用户

发布于 2019-12-31 20:36:17

一种解决方案是使用operator.itemgetter

例如:

代码语言:javascript
复制
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)

打印:

代码语言:javascript
复制
Object1(name='some name', price=42)
Object2(name='some name', title='some title')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59543646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档