gpt4 book ai didi

python - 装饰器参数的评估导致 NameError

转载 作者:行者123 更新时间:2023-11-28 16:34:25 25 4
gpt4 key购买 nike

我有一个带有一个参数的装饰器:

def supportSlice(ret_type=None):
...

我想将它应用于一个类的成员函数,以类本身作为参数:

class BitArray:
@supportSlice(ret_type=BitArray)
def __getitem__(self, idx):
...

但是我在评估 @supportSlice(ret_type=BitArray) 时遇到了 NameError 说“名称‘BitArray’未定义”。装饰器似乎没有在我预期的环境中进行评估。

我的问题是什么时候评估成员函数的装饰器?还有,是否有任何解决方法可以实现我上面描述的目标?

最佳答案

在装饰器运行时(在 class BitArray 的主体内),名称 BitArray 尚未定义!类的名称其主体完成并且其元类(通常是type)构建类对象后定义。

最简单的解决方法是将 ret_type 的确定延迟到以后...:

def supportSlice(ret_type=None):
def wrapper(func):
def wrapfunc(self, *a, **k):
if ret_type is None:
rt = type(self)
else:
rt = ret_type
# rest here, using rt
return wrapfunc
return wrapper

(当然,如果你不需要强制一个不同于 type(self)ret_type 就更简单了,所以你可以使用一个无参数的装饰器,从而丢失一层函数嵌套:).

关于python - 装饰器参数的评估导致 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28378671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com