2016-06-19 38 views
1

Ich habe einen Dekorator, der das Argument einer Funktion für int Typ überprüft.Dekorierte Funktion gibt keine zurück

def check_type_int(old_function): 
    def new_function(arg): 
     if not isinstance(arg, int): 
      print 'Bad Type' # raise TypeError('Bad Type') 
     else: 
      old_function(arg) 
    return new_function 

Wenn ich eine eingerichtete Funktion ausführen, gibt es None anstelle eines int Wert.

@check_type_int 
def times2(num): 
    return num*2 

times2('Not A Number') # prints "Bad Type" 
print times2(2)   # prints "None" 

Die letzte Zeile sollte 4 drucken. Kann jemand bitte meinen Fehler erkennen? Vielen Dank.

+0

Warum Sie explizit Typen wie diese werden überprüft? Und warum 'print', anstatt einen Fehler zu erzeugen, wenn der Typ ungültig ist? – jonrsharpe

Antwort

2

Sie nicht return einen beliebigen Wert von new_function in der Dekorateur, daher gibt es standardmäßig None zurück. Gerade diese Zeile ändern:

old_function(arg) 

zu

return old_function(arg) 
+0

eigentlich sollten Sie übergeben * args nicht arg – Aquiles

+0

Ja, ich wollte es eine einzige Argumentfunktion sein. Vielen Dank. –

0

zum answer von @eugeney Hinzufügen: Es wäre einfacher, wenn Sie return für beide Fälle in if verwendet:

if not isinstance(arg, int): 
    return 'Bad Type'   # return 
else: 
    return old_function(arg) # return 

Und dies:

print times2('2')    # prints Bad Type 
print times2(2)     # prints 4 
-1

Sie benötigen * args und ** kwargs verwenden

def dec(function): 
    def new_f(*args, **kwargs): 
     return function(*args, **kwargs) 
    return new_f