如何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]
我使用以下脚本来评估函数 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]