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或**kwargs从decorated()
我的理解是
@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):
这里发生了什么?我有什么误解?
我的理解是
Run Code Online (Sandbox Code Playgroud)@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>
Run Code Online (Sandbox Code Playgroud)