为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2022-04-27 13:34:54
我有一个函数负责从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,即使它来自另一个函数?
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

我怀疑您是否可以将其传递给 **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'}


查看完整回答
反对 回复 2022-04-27
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

问题是您没有将字典传递给_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。


查看完整回答
反对 回复 2022-04-27
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号