内部装饰器函数如何查看装饰函数参数?

Rob*_*xal 3 python decorator python-3.x

我正在尝试克服自开始以来我一直避免使用的最终基本 Python 功能之一:装饰器。我不像使用 list-comps 那样对它进行操作,而且我不明白装饰器声明中的内部函数是如何工作的。

这是我的意思的一个例子。鉴于此块代码:

def outer(func):
    def inner(*args, **kwargs):
        print('Hi my name is ')
        return func(*args, **kwargs)
    return inner

@outer
def decorated(name):
    print(name)


decorated('Bob')
Run Code Online (Sandbox Code Playgroud)

我知道这将打印

def outer(func):
    def inner(*args, **kwargs):
        print('Hi my name is ')
        return func(*args, **kwargs)
    return inner

@outer
def decorated(name):
    print(name)


decorated('Bob')
Run Code Online (Sandbox Code Playgroud)

但我不明白的是如何inner获得任何*args**kwargsdecorated()

我的理解是

@outer
def decorated(name):
    print(name)
decorated("Bob")
Run Code Online (Sandbox Code Playgroud)

相当于outer(decorated("Bob"))。如果是这种情况,如何inner()能够访问name参数?撇开语法问题不谈,我希望内部声明看起来像def inner(func.args, func.kwargs):

这里发生了什么?我有什么误解?

Jon*_*fer 5

我的理解是

@outter
def decorated(name):
    print(name)
decorated("Bob")
Run Code Online (Sandbox Code Playgroud)

相当于outter(decorated("Bob"))

那是错误的。它相当于outter(decorated)("Bob"). decorated替换为outer(decorated)(即inner)的返回值。当您调用 时decorated,您实际上是在调用inner

您可以以交互方式检查:

>>> def outter(func):
...     def inner(*args, **kwargs):
...         print('Hi my name is ')
...         return func(*args, **kwargs)
...     return inner
...
>>> @outter
... def decorated(name):
...     print(name)
...
>>> decorated
<function outter.<locals>.inner at 0x7f5aec3461e0>
Run Code Online (Sandbox Code Playgroud)