如何return修饰后的值?

How to return the value after decoration?

我使用以下脚本来评估函数 test 中的值是否在限制范围内:

x=[-5,5]
def test(x):
    return x

def check(min,max):
     def decorator(func):
         def wrapper(*args,**kargs):
             y=func(*args,**kargs)
             for index in range(len(y)):
                 if y[index]>max:
                     y[index]=max
                 elif y[index]<min:
                     y[index]=min
             return func(*args,**kargs)
         return wrapper
     return decorator

在这个测试中,最小值是-1,最大值是1,所以我使用check(-1,1)(test(x))修饰test(x)以获得预期的输出值[-1,1]。然而,输出是:

<function __main__.check.<locals>.decorator.<locals>.wrapper>

这不是预期的 [-1,1]

您没有正确包装函数。正确的语法形式是:

check(-1,1)(test)(x)

# check(-1,1)              -> returns func decorator 
#            (test)        -> returns func wrapper
#                  (x)     -> calls wrapper with one argument

最好直接在函数上使用装饰器语法:

@check(-1, -1)
def test(x):
    return x

你应该 return y,修改后的容器,而不是在你的 [=15= 中第二次调用 func ] 函数:

def wrapper(*args,**kargs):
      y = func(*args,**kargs)
      ...
      return y

您的包装器应该 return y,调用未修饰函数的结果,而不是对其进行第二次调用:

x=[-5,5]

def test(x):
    return x

def check(min, max):
    def decorator(func):
        def wrapper(*args, **kargs):
            y=func(*args, **kargs)
            for index in range(len(y)):
                if y[index] > max:
                    y[index] = max
                elif y[index] < min:
                    y[index] = min
            return y  # <- change to this
        return wrapper
    return decorator

test = check(-1, 1)(test)  # decorate test function

print(test(x))  # -> [-1, 1]

如果你不想永久装饰test,你可以用这个代替:

print(check(-1, 1)(test)(x))  # -> [-1, 1]