使用装饰器和显式调用它有什么区别?

gru*_*czy 4 python decorator

我们假设我们有一个装饰者:

def decor(function):
    def result():
        printf('decorated')
        return function()
    return result
Run Code Online (Sandbox Code Playgroud)

以下代码有什么区别:

@decor
def my_foo():
    print('my_foo')
Run Code Online (Sandbox Code Playgroud)

和:

def my_foo():
    print('my_foo')
my_foo = decor(my_foo)
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 7

您的上一个代码段几乎是装饰器的定义.唯一的区别是在第一种情况下,在decor函数定义之前评估名称,而在第二种情况下,在函数定义之后评估名称.这只会在执行函数定义更改名称引用的内容时产生影响.

荒谬的例子:

def decor(function):
    def result():
        printf('decorated')
        return function()
    return result

def plonk():
    global decor
    decor = lambda x: x
    return None
Run Code Online (Sandbox Code Playgroud)

现在

@decor
def my_foo(foo=plonk()):
    print('my_foo')
Run Code Online (Sandbox Code Playgroud)

不同于

def my_foo(foo=plonk()):
    print('my_foo')
my_foo = decor(my_foo)
Run Code Online (Sandbox Code Playgroud)