2017-06-20 26 views
0

我用下面的脚本用于功能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]

回答

0

你的包装应ret瓮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] 
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 

你应该回报y,修改后的容器,而不是调用func第二时间在你的wrapper功能:

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