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

Python: can I unpack arguments without calling a function?

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

目前有

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

我想转换它,也许使用类似于函数参数解包的东西,但没有实际调用函数,所以我最终得到类似的东西:

需要

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

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


编辑:更具体

由于人们询问细节并警告我正在尝试做的事情是危险的,所以我会根据我的需要提供更多背景信息。

我在 class 中有一个 属性,我想使用关键字参数进行设置。类似于 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的担忧可能并不重要。听起来他担心的是,如果我在不知道它们是什么的情况下创建了新的全局变量。

注意:此方法危险。你不应该(在大多数情况下)混淆 locals()globals()。然而,你想要的可以做到,有点:

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

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

你可以这样做:

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

但它确实很具体。问题是为什么你首先在 dict 中有值。

你好像在kwargs里有,为什么不能在那里消费?

如果你不知道字典中的键,你怎么能在代码中使用它们呢?

如果你知道字典中的键,为什么不像这样简单地扩展它:

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

我的最后一个问题是什么?为什么不在需要变量的地方使用 kwargs["this"],尤其是当你不需要它的时候。

您能否向我们提供真实的用例,以便我们可以告诉您我们将如何做到这一点?