如何使用函数装饰器检查函数类型?

How to use function decorators to check type of function?

如何使用函数装饰器来检查另一个函数的参数?我正在努力思考函数装饰器,但它非常令人困惑。

理想情况下,我希望它像这样工作,你在下面传入一个 int 和一个函数,该函数可以工作,否则你会得到一个类型错误。

@check(int)
def printer(arg):
    print(arg)
>>> printer(5)
5

这是我试过的方法,但它不起作用。

def check(typ):

    def validate(args):
        if type(args) == typ:
           return validate(args)
        else:
           raise TypeError

    return validate

任何建议或指导将不胜感激,我真的很想了解装饰器。

check(int) 还需要 return 一个函数。

def check(typ):
    def checker(f):
        def checked_func(arg):
            if isinstance(arg, typ):
                return f(arg)
            else:
                raise TypeError
        return checked_func
    return checker

现在,_ 是由 check 编辑的实际装饰器 return,_ 将原始函数包装在 另一个 函数检查参数的类型,return 是应用于参数的原始函数的结果,或者引发 TypeError。

如果我们把它分成更多的部分,可能会更容易理解。

int_checker = check(int)

@int_checker
def printer(arg):
    print(arg)

在 python 中一切都是对象,甚至函数也是。 让我以不同的方式编写函数只是为了表达

def fun(arg):

可以表示为

fun(a variable) = function(arg) # just like we write in JS

因此我们也可以为变量分配不同的值。同样,我们可以为给定的函数名称分配不同的函数。

简而言之,装饰器的意思是将不同的函数分配给它所覆盖的函数名称

@deco
def func(arg):

相同
 func = deco(func)

为此,装饰器的 return 类型应该是指向另一个函数的指针。

所以装饰器语法就像 -

def deco_func(func): # the parameter is a function
    def wrap_func(args):  #the args are the argument of original function
        #what ever you want to do
        return func(args) #call for original function
retunr wrap_func   # returning of the pointer of the wrap function.