2016-06-19 202 views
1

我有一个装饰器检查int类型的函数参数。装饰函数返回无

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 

当我运行一个装饰作用,它返回None代替int值。

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

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

最后一行应打印4。有人可以发现我的错误吗?谢谢。

+0

你为什么要明确检查类型也是这样吗?为什么'打印'而不是提出错误,如果类型是无效的? – jonrsharpe

回答

2

您不需要return任何值从new_function里面的装饰,因此它默认返回None。只是改变这一行:

old_function(arg) 

return old_function(arg) 
+0

其实你应该通过*参数不是arg – Aquiles

+0

是的,我打算它是一个单参数函数。谢谢。 –

0

通过@eugeney添加到answer:如果您在使用ifreturn两种情况下会更容易:

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

而且这个:

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

您需要使用*指定参数和** kwargs

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