python decorate函数调用

Dsc*_*oni 6 python decorator wrapper

我最近了解了装饰器,并想知道是否可以在函数定义中使用它们,而不是在函数调用中,作为某种通用包装器.

原因是,我想通过用户定义的接口从模块调用函数,该接口对函数执行可重复的操作,并且我不想为每个函数实现包装器.

原则上我想有类似的东西

def a(num):
    return num

@double
a(2)
Run Code Online (Sandbox Code Playgroud)

返回4而无需访问实现a.或者在这种情况下是一个全局包装器

def mutiply(factor,function,*args,**kwargs):
    return factor*function(*args,*kwargs)
Run Code Online (Sandbox Code Playgroud)

是更好的选择?

tur*_*kus 9

你可以这样做:

def a(num):
    return num * 1

def double(f):
    def wrapped(*args, **kwargs):
        return f(*args, **kwargs)
    return wrapped

print(double(a)(2))
Run Code Online (Sandbox Code Playgroud)

这是因为我们可以使用明确的装饰器函数来装饰函数和运行函数,如上例所示.所以在这一个:

print(double(a)(2))
Run Code Online (Sandbox Code Playgroud)

代替a你,你可以放任何功能,代替2args和kwargs.

  • @turkus:也许你应该更改它,以便包装器实际上返回双倍的值?`返回 2 * f(*args, **kwargs)`。或者将装饰器称为其他名称,例如 do_nothing。 (2认同)

joe*_*ick 6

有在马蒂Alchin的书装饰了很好的详细部分专业的Python Apress出版.

虽然新样式@decorator语法只能在函数/类定义中使用,但您可以使用较旧的语法,这样做的方式相同:

from module import myfunc

myfunc = double_decorator(myfunc)

x = myfunc(2) # returns 4
Run Code Online (Sandbox Code Playgroud)