Search code examples
pythonpython-3.xkeyword-argument

How to pop elements from another function's kwargs?


I have a function that is responsible for getting data from the kwargs of several other functions.

The other functions pass their own kwargs to this function along with a keep argument that determines whether or not to keep these properties in the kwargs - i.e. whether to use get or 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)

Getting the values from the kwargs works fine. However, if I try to pop the kwargs, then they are still present in the original function's kwargs. I suspect this is because _handle_kwargs is only modifying its own kwargs.

How can I ensure that the kwargs are removed if I use pop, even if that's coming from another function?


Solution

  • I doubt you can do that passing to **kwargs, as it appears to be passed by value, but if it's ok to modify the inner function, you could pass kwargs as a plain dictionary, i.e. without the **.

    def test(x):
        print(x)
        x.pop('test')
        print(x)
    
    def real(**kwargs):
        test(kwargs)
        print(kwargs)
    
    real(test='nothing', real='something')
    

    Output

    {'test': 'nothing', 'real': 'something'}
    {'real': 'something'}
    {'real': 'something'}