python装饰函数调用

Posted

技术标签:

【中文标题】python装饰函数调用【英文标题】:python decorate function call 【发布时间】:2017-01-15 04:31:22 【问题描述】:

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

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

原则上我想要类似的东西

def a(num):
    return num

@double
a(2)

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

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

是更好的选择吗?

【问题讨论】:

我不确定我是否理解。您想装饰您正在使用的某个第 3 方模块中的功能吗? 我有点疑惑你为什么要装饰任何东西? @joelgoldstick 有点像。如果可能的话,我想做一个全局包装器。 我会使用你的multiply(factor, function),因为你的要求是不可能的。 【参考方案1】:

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

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

from module import myfunc

myfunc = double_decorator(myfunc)

x = myfunc(2) # returns 4

【讨论】:

【参考方案2】:

你可以这样做:

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。

【讨论】:

我现在如何将它与 @ 语法一起使用? 在你的情况下你不能。只能在函数声明中使用 @ 语法。 这对我不起作用。如果我将 a 的定义更改为返回 num+1,最后一行仍会打印 4。 double 函数的命名有点糟糕,因为它实际上并没有加倍。 来找这个评论!概括地说:decorated_func_return_val = some_decorator(some_funk)(*some_args, **some_kwargs)

以上是关于python装饰函数调用的主要内容,如果未能解决你的问题,请参考以下文章

python装饰器实现周期性函数调用

python装饰器实现周期性函数调用

Python(74)_编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名写入文件

Python-4 函数和装饰器

python关于函数调用作为参数的说明&&装饰器

python再议装饰器