2017-02-21 1 views
0

J'écris un décorateur qui saisira TypeError pour le nombre incorrect d'arguments dans un appel de fonction et imprimera un message personnalisé. Le code est ici:Conserver la signature dans Decorator python 2

import inspect 

def inspect_signature(f): 
    def decorate(*args, **kwargs): 
     try: 
      f(*args, **kwargs) 
     except TypeError as e: 
      print('Failed to call "{}" with signature {}. Provided args={} and kwargs={}.'.format(
       f.__name__, inspect.getargspec(f).args, args, kwargs)) 
     return f 
    return decorate 


@inspect_signature 
def func(foo, bar): 
    pass 
func('a') 
func('a', 'b') 

Je reçois la sortie suivante:

Failed to call "func" with signature ['foo', 'bar']. Provided args=('a',) and kwargs={}. 
Called successfully with foo=a, bar=b 
ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None) 

La signature fonction est vide. S'il vous plaît me suggérer une solution comment puis-je le conserver? PS: J'utilise python2 et je ne peux pas passer en python3.

+0

J'ai mis à jour la réponse. Avez-vous eu ça? –

Répondre

0

Vous l'avez manqué ici. func (* foo, ** bar)

Dans votre cas, func('a') ne fonctionnait pas car vous lui donniez un argument fixe.

Vous devez passer un nombre variable d'arguments à votre fonction

@inspect_signature 
def func(*foo, **bar): 
    pass 
+0

Je ne passe pas le nombre variable d'arguments à la fonction. J'ai fixé deux arguments. Je sais que 'func ('a')' ne fonctionnera pas, donc j'ai écrit un décorateur qui imprimera un message personnalisé au lieu du message d'erreur intégré de python mais ma signature de fonction originale est perdue. Donc je veux le garder. –

+0

@python_user Alors, quelle était la définition de votre fonction de signature d'origine? –

0

Vous pouvez consulter Preserving signatures of decorated functions. En un mot, vous pouvez utiliser le module decorator en Python2 et Python3. En bref, vous pouvez utiliser le module . Lorsque vous utilisez Python3.4 +, vous pouvez utiliser inspect.wraps pour Conserver les signatures des fonctions décorées.

Si vous ne souhaitez pas utiliser le module decorator, vous pouvez utiliser eval pour créer un décorateur. En général, eval est impopulaire, donc, decorator module peut être la meilleure solution dans Python2.