【问题标题】:Can we apply python decorator at function invoke?我们可以在函数调用中应用 python 装饰器吗?
【发布时间】:2015-09-29 02:16:52
【问题描述】:

比如说我有一个函数

def A(): pass

我从两个不同的地方调用这个函数

def B():
    #some code
    A()
    #some code

def C():
    #some code
    A()
    #some code

我们知道,装饰器在外行语言中就像一个钩子,它可以让你在函数调用之前和之后执行一组操作。我们使用@ 在函数定义上应用装饰器。

我在这里的要求就像我不希望每次调用函数时都应用装饰器。就像上面的例子一样,如果我在函数A 上应用装饰器。它将应用于两个调用。我们可以在函数A的调用处使用@吗?

类似的,

def A(): pass

def B():
    #some code
    A()
    #some code

def C():
    #some code
    @decorator
    A()
    #some code

这样我就不必担心在特定开源项目的每次发布后合并我的代码。

【问题讨论】:

  • @MartijnPieters 好的.. 我会相应地更改它
  • 不需要,已经完成了。

标签: python decorator python-decorators


【解决方案1】:

装饰器只是语法糖,@expression 的结果被调用,返回值用于替换被装饰的对象。

如果您只需要在一个位置有一个修饰函数,您可以执行decorator(A)() 让它返回一个修饰版本,以便在C 中使用并当场调用该修饰对象。

更好的是,存储该修饰版本以供 C 使用,这样您就不必每次都继续修饰它:

A_decorated = decorator(A)

def C():
    # some code
    A_decorated()
    # some code

【讨论】:

  • 这里我们没有在函数 A 上应用装饰器。但是我们创建了一个新的装饰函数,它只调用函数 A。我想知道我们是否可以在调用时装饰方法 A。
  • @Nilesh 不,您正在应用装饰器。装饰器只是一个接受函数参数并返回函数的函数——@ 语法只是为了方便。为什么每次调用A 时都想要重新装饰它?
  • @Nilesh:这与使用@decorator 语法所做的事情完全相同。装饰器没有什么神奇之处,它只是语法糖。
  • 我想这应该足以满足我的要求。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2020-05-20
  • 2019-02-02
  • 2021-07-15
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
相关资源
最近更新 更多