python decorator - is it possible to return a function that expects more params?

Viewed 69

I have a really simple function, defined as

def test(x):
   return x

I would like to wrap it with a decorator, that returns a function that expects another kwargs param.

@simple_dec
def test(x):
   return x

Inside that decorator function, i would pop that param from the kwargs dict, and that just call test function with the params test would expect to get, without breaking it:

def simple_dec():

     def simple_dec_logic(func, *args, **kwargs):
          kwargs.pop("extra_param")
          return func(*args, **kwargs)

     return decorator.decorate(_func, simple_dec_logic)

My issue is - after wrapping it, if I call:

test(1, extra_param=2)

It fails on "test got unexpected param extra_param", although if the code would actually run, the decorator would handle this and call test func, without that param. If I get it correctly, the interpreter just fails it, before running the code and knowing it's defined with a decorator.

Is there any way to work around this? I would like the decorator to let me call the test function with more params, without defining them in the test function.

1 Answers

This works fine:

import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper_decorator(*args, **kwargs):
        kwargs.pop('extra_param')
        value = func(*args, **kwargs)
        return value
    return wrapper_decorator

@decorator
def test(x):
    return x

test(1, extra_param=2)
Related