2017-03-03 5 views
0

Ich versuche, das Dienstprogramm der Dekoratoren in Python zu testen. Wenn ich die folgenden Codes zu schreiben, gibt es einen Fehler:Python Decorator: TypeError: Funktion nimmt 1 Positionargument, aber 2 wurden gegeben

TypeError: fizz_buzz_or_number() takes 1 positional argument but 2 were given 

I log_calls(fn) als

def log_calls(fn): 
    ''' Wraps fn in a function named "inner" that writes 
    the arguments and return value to logfile.log ''' 
    def inner(*args, **kwargs): 
     # Call the function with the received arguments and 
     # keyword arguments, storing the return value 
     out = fn(args, kwargs) 

     # Write a line with the function name, its 
     # arguments, and its return value to the log file 
     with open('logfile.log', 'a') as logfile: 
      logfile.write(
       '%s called with args %s and kwargs %s, returning %s\n' % 
       (fn.__name__, args, kwargs, out)) 

     # Return the return value 
     return out 
    return inner 

Nachdem die eine Funktion ersten definieren, I log_calls verwenden eine andere Funktion als dekorieren:

@log_calls 
def fizz_buzz_or_number(i): 
    ''' Return "fizz" if i is divisible by 3, "buzz" if by 
     5, and "fizzbuzz" if both; otherwise, return i. ''' 
    if i % 15 == 0: 
     return 'fizzbuzz' 
    elif i % 3 == 0: 
     return 'fizz' 
    elif i % 5 == 0: 
     return 'buzz' 
    else: 
     return i 

Wenn ich den folgenden Code ausführen

for i in range(1, 31): 
    print(fizz_buzz_or_number(i)) 

Der Fehler TypeError: fizz_buzz_or_number() takes 1 positional argument but 2 were given kommt.

Ich weiß nicht, was mit diesem Dekorateur falsch ist, und wie man das beheben kann.

Antwort

0

Sie sind in zwei Argumente an Ihre dekoriert Funktion übergeben hier: wieder

out = fn(args, kwargs) 

Wenn Sie das args Tupel und kwargs Wörterbuch als variable Argumente anwenden wollte, Echo die Signatur-Syntax, so verwenden * und ** :

:

out = fn(*args, **kwargs) 

die Call expressions reference documentation See

+0

Ich sehe was du meinst. Ich habe es nach deinem Vorschlag noch einmal versucht, es funktioniert jetzt. Danke vielmals. – Luhuimiaomiao

Verwandte Themen