我们可以在函数调用时应用python decorator吗?

时间:2015-07-10 10:51:01

标签: python decorator python-decorators

比如说我有一个功能

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

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

1 个答案:

答案 0 :(得分:3)

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

如果您只需要在一个位置设置一个装饰函数,则可以decorator(A)()让它返回一个仅用于C的装饰版本,并在现场调用该装饰对象。 / p>

更好的是,将C的装饰版本存储起来使用,这样你就不会每次都装饰它:

A_decorated = decorator(A)

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