0

I am trying to create a decorator having more than one argument. However, it doesn't always seem to be receiving the unwrapped function.

def wait(*args, **kwargs):
    print("args == ", args)
    str_kwargs = "\n".join(str(x) for x in kwargs.keys())
    print("kwargs: " + str_kwargs if len(str_kwargs) > 1 else "no kwargs")
    return args[0]

#######################################################
print("begin test 1")
@wait
def print_something_else(something):
    print (something)

#######################################################
print("begin test 2")
def print_something_else(something):
    print(something)
print_something_else = wait(print_something_else, delay=0.2)

#######################################################
print("begin test 3")
@wait(delay=0.2)
def really_print_something_else(something):
    print (something)

For test#3, args is empty. We receive only delay. It is as if we wrote:

really_print_something_else = wait(delay=0.2)
Toothpick Anemone
  • 4,290
  • 2
  • 20
  • 42
  • 1
    I don't think `wait` is really a decorator. – Buckeye14Guy Oct 28 '19 at 20:04
  • @ToothpickAnemone. The duplicate pretty much explains exactly what is happening in #3. `@wait(...)` is `@(wait(...))`. I.e., just as `@wait` gets called as `func = wait(func)`, `@wait(...)` gets called as `func = wait(...)(func)`. – Mad Physicist Oct 28 '19 at 21:24

0 Answers0