2017-06-20 1 views
0

I utilisé le script suivant pour évaluer si les valeurs de la fonction test sont dans les limites:Comment retourner la valeur après la décoration?

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 

Dans ce test, le minimum est de 1 et un maximum de 1, de sorte que I utilisé pour la décoration de check(-1,1)(test(x))test(x) afin pour obtenir la valeur de sortie attendue comme [-1,1]. Cependant, la sortie est:

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

qui n'est pas [-1,1] prévu.

Répondre

0

Votre emballage devrait ret urne y, le résultat de l'appel de la fonction undecorated, plutôt que de faire un second appel à lui:

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] 

Si vous ne voulez pas décorer de façon permanente test, vous pouvez utiliser ceci:

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

Vous n'emballez pas la fonction correctement. La forme syntaxique correcte est:

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

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

Mieux vaut utiliser la syntaxe de décorateur sur la fonction directement tho:

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

Et vous devriez retoury, le récipient modifié, et ne pas appeler func une seconde temps dans votre wrapper fonction:

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