装饰器运算符(`@`)的纯python实现是什么样的?

Too*_*one -3 python decorator python-3.x python-decorators

假设以下内容:

@two
def zero:
    pass
Run Code Online (Sandbox Code Playgroud)

被实现为:

zero = __@__(two, zero)
Run Code Online (Sandbox Code Playgroud)

外表的__@__模样会是什么样?我以前认为是以下情况:

def __@__(two, zero):
    return two(x)
Run Code Online (Sandbox Code Playgroud)

也许这是正确的,但即将推出更多细节。

考虑下面的示例。

def three(y):
    def two(zero):
        print(y)
        def one(*args, **kwargs):
            print(y)
            return zero(*args, **kwargs)
        return one
    return two

###################################

@three(5)
def zero(x):
    print(x)
Run Code Online (Sandbox Code Playgroud)

在这里,看起来下面的代码####[...]####类似于:

def __@__(two, zero):
    return two(zero)

two_inst = three(5)
zero = __@__(two_inst, zero)
Run Code Online (Sandbox Code Playgroud)

__@__如果有a four,a five或a ,使用的伪代码会是什么样six
其次,关于多个装饰器,例如:

@twoA
@twoB
@twoC
def zero:
    pass
Run Code Online (Sandbox Code Playgroud)

nor*_*ok2 7

@在Python中没有“装饰器运算符” 这样的东西。

@<name>前面的def在Python为函数/方法工厂一个语法糖:

@foo
def bar(x):
    ...
Run Code Online (Sandbox Code Playgroud)

等效于:

bar = foo(bar)
Run Code Online (Sandbox Code Playgroud)

请注意,函数bar本身而不是对其的调用(例如not bar())被传递给foo

许多Python教程都提供了有关此内容的更多信息,例如here