猿问

如何从另一个函数的 kwargs 中弹出元素?

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


keep其他函数将它们自己的 kwargs 以及一个决定是否将这些属性保留在 kwargs 中的参数一起传递给该函数- 即是否使用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,那么它们仍然存在于原始函数的kwargs. 我怀疑这是因为_handle_kwargs只是在修改自己的 kwargs。


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


狐的传说
浏览 163回答 2
2回答

MMTTMM

我怀疑您是否可以将其传递给 **kwargs,因为它似乎是按值传递的,但如果可以修改内部函数,您可以将 kwargs 作为普通字典传递,即没有**.def test(x):    print(x)    x.pop('test')    print(x)def real(**kwargs):    test(kwargs)    print(kwargs)real(test='nothing', real='something')输出{'test': 'nothing', 'real': 'something'}{'real': 'something'}{'real': 'something'}

慕妹3242003

问题是您没有将字典传递给_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不带星号的调用 - 只需传递 dict。
随时随地看视频慕课网APP

相关分类

Python
我要回答