2017-03-14 1 views
0

J'essaie d'utiliser un décorateur pour imprimer mes journaux. Et pour ce faire, je l'ai défini décorateur dans un fichier nommé custom_logger.py:Impossible d'utiliser le décorateur défini dans un autre fichier en python

import logging 

class Logger(object): 
    def __init__(self,decoratee_enclosing_class): 
     self.decoratee_enclosing_class = decoratee_enclosing_class 
    def __call__(self, aFunc): 
     """Trace entry, exit and exceptions.""" 
     def loggedFunc(*args, **kw): 
     print "enter", aFunc.__name__ 
     try: 
      result= aFunc(*args, **kw) 
     except Exception, e: 
      print "exception", aFunc.__name__, e 
      raise 
     print "exit", aFunc.__name__ 
     return result 
     loggedFunc.__name__= aFunc.__name__ 
     loggedFunc.__doc__= aFunc.__doc__ 
     return loggedFunc 

Et voici mon code de test d'échantillon:

from custom_logger import Logger 

class Test(object): 
    @Logger('Test') 
    def testP(self): 
     print "hello" 
a = Test() 
a.testP() 

J'obtiens l'erreur suivante: retraçage (le plus récent dernier appel): fichier "test.py", ligne 13, à a.testP() TypeError: objet 'NoneType' est pas appelable

Ainsi peut-on signaler ce que je manque? J'ai suivi ce lien pour reference.

+0

Les trois dernières lignes du premier bloc de code doivent être dépassées d'un niveau. – SuperSaiyan

+0

Quel est le but de 'decoratee_enclosing_class'? Pourquoi prendre le nom de classe comme argument à un décorateur de méthode? Aussi, excepté Exception, e: 'est à ce stade une syntaxe très ancienne qui ne fonctionnera pas sur Python 3.x. – jonrsharpe

+0

@jonrsharpe Merci de m'avoir signalé ... mais c'est juste un exemple de code que j'essayais. – Rahul

Répondre

3

Vous avez une erreur d'indentation dans votre décorateur. Les trois dernières lignes de la méthode __call__ doivent se trouver dans la même indentation que la ligne def loggedFunc.

+0

Merci @Daniel ... c'était vraiment une erreur stupide. – Rahul