我如何制作一个虚拟的@jit 装饰器?

end*_*ith 5 python decorator python-decorators numba

我希望 numba 是一个可选的依赖项,以便安装时速度很快,如果不安装则速度很慢。所以当没有安装 numba 时,我想@njit成为一个什么都不做的虚拟装饰者。

如果我遵循这些说明并使用:

def njit(func):
    return func
Run Code Online (Sandbox Code Playgroud)

然后当装饰器被调用时,@njit(cache=True, nogil=True)我收到以下错误:

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

如果我尝试捕获参数并使用忽略它们

    def njit(func, *args, **kwargs):
        return func
Run Code Online (Sandbox Code Playgroud)

然后我得到:

missing 1 required positional argument: 'func'

我如何制作一个什么都不做并且忽略 kwargs 的虚拟装饰器?

gec*_*kos 6

将带参数的装饰器视为装饰器工厂,它们返回一个装饰器。这边走

def decorator(func):
    return func
Run Code Online (Sandbox Code Playgroud)

上面是一个装饰器,现在有参数

def decorator_factory(a,b,c):
    def decorator(func):
        return func
    return decorator
Run Code Online (Sandbox Code Playgroud)

内部decorator可以访问a,b,c参数,因为它是一个闭包。我希望有帮助


所以可以定义为:

def njit(cache, nogil):
    def decorator(func):
        return func 
    return decorator
Run Code Online (Sandbox Code Playgroud)

  • @endolith:只有当你总是执行“@njit()”而不是“@njit”时。如果您执行“@njit”,它会默默地做错误的事情。 (2认同)