我们能在函数调用时应用Python装饰器吗?

3
例如,假设我有一个函数。
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 好的..我会相应地进行更改。 - Nilesh
谢谢,我会记住。 - Martijn Pieters
1个回答

6

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

如果您只需要在一个位置中使用装饰函数,可以执行decorator(A)()以返回一个修饰版本,仅供在C中使用,并立即调用该修饰对象。

更好的方法是将该修饰版本存储供C使用,这样您不必每次都进行修饰:

A_decorated = decorator(A)

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

在这里,我们没有在函数A上应用装饰器。但是,我们已经创建了一个新的装饰函数,它只调用函数A。我想知道是否可以在调用方法A时装饰它。 - Nilesh
@Nilesh 不,你正在应用装饰器。装饰器只是一个接受函数参数并返回函数的函数 - @语法仅仅是为了方便。你为什么要每次调用A时都重新装饰它呢? - jonrsharpe
@Nilesh:这与使用@decorator语法所做的完全相同。装饰器没有什么神奇的地方,它只是语法糖 - Martijn Pieters
我猜这样就可以满足我的需求了。谢谢。 - Nilesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接