2017-06-04 1 views
-2

J'ai problème avec l'exercice suivant: https://pythonprogramming.net/decorators-intermediate-python-tutorial/ est le code que je ici voulais écrire:exercice d'emballage de fonction (décorateurs)

def add_wrapping(item): 
    def wrapped_item(): 
     return 'a wrapped up box of {}'.format(str(item())) 
    return wrapped_item 

@add_wrapping 
def new_gpu(): 
    return 'a new Tesla P100 GPU!' 
print(new_gpu()) 

Voici mon code:

def add_wrapping(item): 
    def wrapped_item(): 
     return "a wrapped up box of {}".format(str(item())) 
    return wrapped_item() 
@add_wrapping 
def new_gpu(): 
    return "new car!" 
print(new_gpu()) 

Je travaille dans PyCharm, voici une erreur qu'il me donne:

line 17, in <module> 
    print(new_gpu()) 
TypeError: 'str' object is not callable 

Je suis coincé à ce stade, ne peut pas comprendre ce qui s'est mal passé, toute aide est appréciée!

+0

utilisez 'return wrapped_item'. Actuellement vous appelez la fonction avant de renvoyer *, ceci entraîne l'assignation de 'new_gpu' au résultat de' wrapped_item() 'qui est un' str'. –

+0

Pourquoi le code que vous vouliez écrire est-il différent du code que vous avez écrit? – martineau

+0

Le code est différent parce que je n'ai pas voulu réécrire son code mais j'ai créé le mien, mais je suis resté dans l'exercice donné – econ

Répondre

1

Vous devez d'abord retourner wrapped_item objet au lieu de retour wrapped_item()

par exemple, vous pouvez appeler func l'intérieur de votre argument de décorateur.

def add_wrapping(func): 
    def wrapped_item(): 
     return "a wrapped up box of " + func() 
    return wrapped_item 

@add_wrapping 
def new_gpu(): 
    return "new car!" 
print(new_gpu()) 

mais il est fonctionnera si vous êtes retourné l'argument str en fonction new_gpu.