如何从另一个函数的分支弹出元素?

时间:2019-08-08 16:12:28

标签: python python-3.x kwargs

我有一个函数,负责从其他几个函数的kwargs中获取数据。

其他函数将自己的kwarg连同keep参数一起传递给该函数,该参数确定是否将这些属性保留在kwarg中-即是使用get还是pop

def _handle_kwargs(keep, **kwargs):
    # keep: whether to keep the kwarg when we're done with it (i.e. get or pop)
    if keep: func = getattr(kwargs, 'get')
    else: func = getattr(kwargs, 'pop')

    # get or pop some kwargs individually
    debug = func('debug', False)
    assert isinstance(debug, bool)
    ...
    # repeated for several different possible kwargs
    return debug, some_other_kwarg, ...

def normal_function(**kwargs)
    debug, some_other_kwarg = _handle_kwargs(False, **kwargs)

从kwargs获取值可以正常工作。但是,如果我尝试pop,则它们仍然存在于原始函数的kwargs中。我怀疑这是因为_handle_kwargs仅修改了自己的kwarg。

即使我使用pop,即使来自另一个函数,也如何确保删除kwarg?

2 个答案:

答案 0 :(得分:2)

我怀疑您可以传递给** kwargs,因为它似乎是通过值传递的,但是如果可以修改内部函数,可以将kwargs作为普通字典传递,即不带{{1} }。

**

输出

def test(x):
    print(x)
    x.pop('test')
    print(x)

def real(**kwargs):
    test(kwargs)
    print(kwargs)

real(test='nothing', real='something')

答案 1 :(得分:1)

问题是您没有将字典传递给_handle_kwargs。调用函数时,** kwargs语法实际上“爆炸”了kwargs。

也就是说,如果kwargs为{'a':1,'b':2},则_handle_kwargs(False, **kwargs)等效于_handle_kwargs(False, kwargs['a'], kwargs['b'])。您根本不会通过kwargs字典!

_handle_kwargs将它们收集到新字典中,因此不会影响原始字典。

解决方案非常简单。

首先,def _handle_kwargs(keep, kwargs):不带星号。刚收到一个命令。 其次,这样称呼它:

def normal_function(**kwargs)
    debug, some_other_kwarg = _handle_kwargs(False, kwargs)

请参见第二行-不带星号的调用_handle_kwargs-只需传递命令即可。