【问题标题】:python decorate function callpython装饰函数调用
【发布时间】: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),因为你的要求是不可能的。

标签: python wrapper decorator


【解决方案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)
    猜你喜欢
    • 2010-09-21
    • 2017-12-11
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多