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

时间:2019-03-07 22:07:04

标签: python python-3.x decorator

我正在尝试征服自开始以来就一直避免使用的最终基本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')

我知道这将打印

Hi my name is
Bob

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

我的理解是

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

等效于outer(decorated("Bob"))。如果是这种情况,inner()将如何访问name参数?除了语法问题,我希望inner的声明看起来像def inner(func.args, func.kwargs):

这是怎么回事?我有什么误会?

1 个答案:

答案 0 :(得分:3)

  

我的理解是

@outter
def decorated(name):
    print(name)
decorated("Bob")
     

等效于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>