问题描述
我有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
这有效。但是现在我正在对该功能进行单元测试,并且在单元测试中,我希望能够提供特定的键值对作为普通对象,以便我可以有效地使用hypothesis
和pytest
的@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()
但这确实很具体。问题是,为什么首先要在字典中使用值。
您似乎把它们放在矮人之中,为什么不能将它们消耗在那里?
如果您不知道字典中的键,那么如何在代码中使用它们呢?
如果您知道字典中的键,为什么不像这样简单地将其扩展:
this,that = kwargs["this"],kwargs["that"]
我的最后一个问题是?为什么不在需要变量的地方使用kwargs["this"]
,尤其是在您不需要太多变量的情况下。
您能提供给我们真正的用例,以便我们告诉您我们将如何做吗?