2017-06-20 3 views
0

verwendete ich das folgende Skript für in Funktion test innerhalb der Grenzen, ob die Werte der Bewertung sind:Wie wird der Wert nach der Dekoration zurückgegeben?

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 

In diesem Test ist das Minimum -1 und maximal 1, so habe ich check(-1,1)(test(x)) für test(x) um die Dekoration um den erwarteten Ausgabewert als [-1,1] zu erhalten. Allerdings ist der Ausgang:

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

, die nicht die erwarteten [-1,1] ist.

Antwort

0

Ihr Wrapper ret sollte Urne y, das Ergebnis der undecorated Funktion aufrufen, anstatt einen zweiten Anruf, um es zu machen:

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] 

Wenn Sie nicht dauerhaft test dekorieren wollen, können Sie diese stattdessen verwenden:

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

Sie wickeln die Funktion nicht richtig ein. Die korrekte syntaktische Form ist:

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

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

besser die Dekorateur Syntax auf der Funktion zu verwenden, um direkt tho:

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

Und Sie sollten Rückkehry, der modifizierte Behälter und func nicht einen zweiten Anruf Zeit in Ihrer wrapper Funktion:

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