Python 在运行时更改**库**装饰器的参数值(例如numba';s ngit(并行))

Python 在运行时更改**库**装饰器的参数值(例如numba';s ngit(并行)),python,decorator,numba,Python,Decorator,Numba,虽然装饰器接受参数,但当解释器看到底层函数的声明时,会解析它们的值,因此在函数调用期间保持“常量” 问题是当您使用库中的装饰器或其他第三方代码时,如何在运行时修改装饰器参数值。具体来说,我的问题是,如何决定何时允许在numba的njit装饰器上并行运行,该装饰器接受这一布尔参数 免责声明 这个问题已经被问了很多次,但是每个人都隐式地假设我们控制着装饰程序的源代码。在中,@C2H5OH的答案实际上解决了这个问题,但它与“外部”装饰器一起工作的事实几乎没有引起注意,因此任何面临相同问题的人都必须进

虽然装饰器接受参数,但当解释器看到底层函数的声明时,会解析它们的值,因此在函数调用期间保持“常量”

问题是当您使用库中的装饰器或其他第三方代码时,如何在运行时修改装饰器参数值。具体来说,我的问题是,如何决定何时允许在
numba
njit
装饰器上并行运行,该装饰器接受这一布尔参数


免责声明 这个问题已经被问了很多次,但是每个人都隐式地假设我们控制着装饰程序的源代码。在中,@C2H5OH的答案实际上解决了这个问题,但它与“外部”装饰器一起工作的事实几乎没有引起注意,因此任何面临相同问题的人都必须进行大量搜索。
因此,这个问题旨在自我回答,以明确这一差异,并展示如何具体使用numba


因此,对于代码: 假设我们必须使用以下装饰器,该装饰器在函数调用之前打印其参数的值,但我们无法修改其源:

def decorator_和_参数(a):
def实际_装饰器(func):
def函数_包装(*args,**kwargs):
打印(f“在函数调用之前。a={a}”)
func(*args,**kwargs)
返回函数
返回实际值修饰符
我想这样做:


a=1
@带参数的装饰器(a)
def foo():
打印(“Hi”)
>>>foo()
#在函数调用之前。a=1
#嗨
>>>a=2
>>>foo()

#在函数调用之前。a=1该问题的解决方法是将修饰函数的声明封装在(但)另一个处理“设置”的包装函数中。decorator的参数可以作为参数传递给外部“setup”函数,该函数实际上每次都会重新声明相同的函数(但decorator的行为不同)

现在有一个范围问题需要解决,因为我们原来的函数现在是嵌套的。为此,我们可以简单地返回修饰函数或将其分配给全局变量

代码解决方案:

def功能设置(a):
@带参数的装饰器(a)
def_foo():
打印(“Hi”)
>>>foo=功能设置(1)
>>>foo()
#在函数调用之前。a=1
#你好
>>>foo=功能设置(2)
>>>foo()
#在函数调用之前。a=2
#你好

对于numba案例:


def功能_设置(并行):
@注:njit(平行=平行)
def并行测试(A):
s=0
对于nb.prange中的i(A.shape[0]):
s+=A[i]
返回s
返回并行测试
将numpy作为np导入
从TQM导入TQM
A=np.随机。随机(100)
并行测试=功能设置(并行=真)
对于tqdm中的uu(范围(1000000)):
平行试验(A)
# 100%|██████████| 1000000/1000000 [00:04