Search code examples
pythondecoratorpython-decoratorsnumba

How do I make a dummy do-nothing @jit decorator?


I want numba to be an optional dependency, so that it's fast if installed or slow if not. So when numba is not installed, I want @njit to be a dummy decorator that does nothing.

If I follow these directions and use:

def njit(func):
    return func

Then when the decorator is called like @njit(cache=True, nogil=True) I get errors about:

TypeError: njit() got an unexpected keyword argument 'cache'

If I try to catch the args and ignore them using

    def njit(func, *args, **kwargs):
        return func

then I get:

missing 1 required positional argument: 'func'

How do I just make a dummy decorator that does nothing and ignores kwargs?


Solution

  • Think of decorators with arguments as decorator factory, they return a decorator. This way

    def decorator(func):
        return func
    

    The above is a decorator, now with arguments

    def decorator_factory(a,b,c):
        def decorator(func):
            return func
        return decorator
    

    The inner decorator has access to the a,b,c arguments because it is a closure. I hope that helps


    So it can be defined as:

    def njit(cache, nogil):
        def decorator(func):
            return func 
        return decorator