Python:我可以在不调用函数的情况下解压参数吗?

2024-09-27 19:17:50 发布

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

我有dict要转换成几个不同的对象。例如:

目前有

kwargs = {'this': 7, 'that': 'butterfly'}

我想转换它,可能使用类似于函数参数解包的东西,但不实际调用函数,因此我最终得到如下结果:

所需

**kwargs
print(this) # Will print out `7`
print(that) # Will print out `'butterfly'`

我知道我不能像我所展示的那样使用双星[**]。但我能做些类似的事情吗


编辑:更多细节

因为人们都在询问细节,并警告我所做的事情是危险的,所以我会为我的需要提供更多的背景

我想使用关键字参数设置类中的属性。类似于什么是shown here,但是解包kwargs而不是args

作为一个功能玩具示例,它如下所示:


class A(object):
    def __init__(self):
        self._idx = None
    @property
    def idx(self):
        return self._idx
    @idx.setter
    def idx(self, kwargs):
        print(kwargs)
        self._idx = {}
        for kw, val in kwargs.items():
            self._idx[kw] = val

这很有效。但是现在我正在对函数进行单元测试,在单元测试中,我希望能够提供特定的键值对作为普通对象,以便有效地使用hypothesispytest@mark.parametrize

为了做到这一点,看起来我需要像上面描述的那样的“裸解包”

由于这些实际上都是方法中的局部变量,我觉得@g.d.d.c的关注点可能并不重要。听起来他担心的是,如果我在不知道全局变量是什么的情况下创建了新的全局变量


Tags: 对象selfthatdefvaloutthis事情
2条回答

注意:这种方法是危险的。你不应该(在大多数情况下)胡乱处理locals()globals()。然而,你想要的是可以做到的,比如:

>>> kwargs = {'this': 7, 'that': 'butterfly'}
>>> 
>>> locals().update(kwargs)
>>> this
7
>>> that
'butterfly'

它仍然调用函数(locals()上的更新),但它确实在本地名称空间中为您提供名称

你可以做:

this, that = {"this": 7, "that": "butterfly"}.values()

但它确实是具体的。问题是,为什么一开始你的字典里有这些值

你好像把它们放在夸尔格,为什么你不能把它们放在那里

如果您不知道dict中的键,那么如何在代码中使用它们

如果您知道dict中的键,为什么不简单地像这样展开它:

this, that = kwargs["this"], kwargs["that"]

我的最后一个问题是什么?为什么不在需要变量的地方使用kwargs["this"],特别是在不太需要的情况下

你能给我们提供真实的用例,让我们告诉你我们将如何做到这一点吗

相关问题 更多 >

    热门问题