2016-10-12 6 views
2

Ich habe den folgenden Code:Python Dekorateur Logger

def log(func): 
    def wrapper(*args, **kwargs): 
     func_str = func.__name__ 
     args_str = ', '.join(args) 
     kwargs_str = ', '.join([':'.join([str(j) for j in i]) for i in kwargs.iteritems()]) 
     with open('log.txt', 'w') as f: 
      f.write(func_str) 
      f.write(args_str) 
      f.write(kwargs_str) 
     return func(*args, **kwargs) 
    return wrapper() 


@log 
def example(a, b): 
    print('example') 

Aber auch ohne jede Funktion aufrufen, erhalte ich immer noch den Fehler:

TypeError: example() takes exactly 2 arguments (0 given) 

Kann mir jemand erklären, warum dies geschieht, weil es scheint die Funktion heißt, aber ich verstehe nicht warum. hier

Antwort

3

Sie sollten die wrapper Funktion zurück, ohne sie zu rufen:

return wrapper 

Nannte es impliziert die Anruf an wrapper muss ausgewertet werden, wie du bist jemals mit der falschen Signatur anrufen.

4

Weil Sie es nennen:

return wrapper() 

Es sollte sein:

return wrapper 
+0

Das hat es geschafft! Macht Sinn, jetzt sehe ich es im Vergleich zu Beispielen. –