如何从另一个函数的 kwargs 中弹出元素?
How to pop elements from another function's kwargs?
我有一个函数负责从其他几个函数的 kwargs
中获取数据。
其他函数将它们自己的 kwargs 与一个 keep
参数一起传递给此函数,该参数决定是否将这些属性保留在 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。
如果我使用 pop
,我如何确保 kwargs 被删除,即使它来自另一个函数?
我怀疑你是否可以将它传递给 **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'}
问题是您没有将字典传递给 _handle_kwargs
。实际调用函数时的 **kwargs 语法 "explodes" 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
- 只需传递字典即可。
我有一个函数负责从其他几个函数的 kwargs
中获取数据。
其他函数将它们自己的 kwargs 与一个 keep
参数一起传递给此函数,该参数决定是否将这些属性保留在 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。
如果我使用 pop
,我如何确保 kwargs 被删除,即使它来自另一个函数?
我怀疑你是否可以将它传递给 **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'}
问题是您没有将字典传递给 _handle_kwargs
。实际调用函数时的 **kwargs 语法 "explodes" 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
- 只需传递字典即可。