Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 669
tamirg Avatar asked Feb 21 '26 17:02

tamirg


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)
like image 68
Oin Avatar answered Feb 24 '26 05:02

Oin