我正在尝试征服自开始以来就一直避免使用的最终基本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
获得任何**kwargs
或decorated()
我的理解是
@outer
def decorated(name):
print(name)
decorated("Bob")
等效于outer(decorated("Bob"))
。如果是这种情况,inner()
将如何访问name
参数?除了语法问题,我希望inner的声明看起来像def inner(func.args, func.kwargs):
这是怎么回事?我有什么误会?
答案 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>