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
这行得通。但现在我正在对该功能进行单元测试,在单元测试中,我希望能够提供特定的键值对作为普通对象,以便我可以有效地使用 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()
但它确实很具体。问题是为什么你首先在 dict 中有值。
你好像在kwargs里有,为什么不能在那里消费?
如果你不知道字典中的键,你怎么能在代码中使用它们呢?
如果你知道字典中的键,为什么不像这样简单地扩展它:
this, that = kwargs["this"], kwargs["that"]
我的最后一个问题是什么?为什么不在需要变量的地方使用 kwargs["this"]
,尤其是当你不需要它的时候。
您能否向我们提供真实的用例,以便我们可以告诉您我们将如何做到这一点?
我有 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
这行得通。但现在我正在对该功能进行单元测试,在单元测试中,我希望能够提供特定的键值对作为普通对象,以便我可以有效地使用 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()
但它确实很具体。问题是为什么你首先在 dict 中有值。
你好像在kwargs里有,为什么不能在那里消费?
如果你不知道字典中的键,你怎么能在代码中使用它们呢?
如果你知道字典中的键,为什么不像这样简单地扩展它:
this, that = kwargs["this"], kwargs["that"]
我的最后一个问题是什么?为什么不在需要变量的地方使用 kwargs["this"]
,尤其是当你不需要它的时候。
您能否向我们提供真实的用例,以便我们可以告诉您我们将如何做到这一点?