Python - Decorators

There are three issues I see with your current code.

First, you're calling the inner function, rather than returning a reference to it.

Second, your inner function doesn't take the same arguments as the function you're decorating. In this case, you need to take at least the x argument explicitly (some inner functions can use *args and **kwargs exclusively, but aparently not yours).

Lastly, you're never calling the wrapped function. While this isn't strictly required (it might be useful to swap out a method with a decorator during development), usually you want to call the function at some point during the inner function's code.

So, to wrap the whole thing together, I think you want your code to be something like this:

def wrapper(func):
    def inner(x, y):
        if issubclass(x, int): # issue 2
            return func(x, y) # issue 3
            return "invalid values" # consider raising an exception here instead!

    return inner # issue 1

Your decorator should look like this:

def wrapper(func):
    def inner(x, y): # inner function needs parameters
        if issubclass(type(x), int): # maybe you looked for isinstance?
            return func(x, y) # call the wrapped function
            return 'invalid values'
    return inner # return the inner function (don't call it)

Some points to note:

  • issubclass expects a class as first argument (you could replace it with a simple try/except TypeError).
  • the wrapper should return a function, not the result of a called function
  • you should actually call the wrapped function in the inner function
  • your inner function didn't have parameters

You can find a good explanation of decorators here.