python 修饰函数调用

python decorate function call

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

这样做的原因是,我想通过用户定义的接口调用模块中的函数,该接口对函数执行可重复的操作,我不想为每个函数都实现一个包装器。

原则上我想要

def a(num):
    return num

@double
a(2)

返回 4 而无需访问 a 的实现。 或者在这种情况下会像

这样的全局包装器
def mutiply(factor,function,*args,**kwargs):
    return factor*function(*args,*kwargs)

是更好的选择吗?

你可以这样做:

def a(num):
    return num * 1

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

print(double(a)(2))

这是因为我们可以装饰函数,运行 函数可以像上面的例子那样使用显式装饰器函数。 所以在这一篇中:

print(double(a)(2))

您可以在 a 的位置放置任何函数,并在 2、args 和 kwargs 的位置。

在 Apress 的 Marty Alchin 的书 Pro Python 中有一个关于装饰器的非常详细的部分。

虽然新样式的@decorator 语法仅可用于 function/class 定义,但您可以使用旧语法,以这种方式做同样的事情:

from module import myfunc

myfunc = double_decorator(myfunc)

x = myfunc(2) # returns 4

我发现一个有用的方法是定义一个装饰的新函数

def my_function():
    pass

@my_decorator
def my_function_with_decorator(*args, **kwargs):
    my_function()

my_function() # call without decorator

my_function_with_decorator() # call with decorator