【发布时间】:2017-10-04 09:35:59
【问题描述】:
在 Python 中,我对装饰器有所了解。 在我的拙劣理解中,装饰函数声明返回装饰器函数使用原始函数构造的任何内容(最合理地,这应该是可调用的):
def deco(func):
def func_wrapper(name):
return func(name)+", how are you?"
return func_wrapper
@deco
def foo(name):
return "Hello "+name
print(foo("Michael"))
这给出了:
Hello Michael, how are you?
但是如果一个装饰器与一个参数一起被指定:
def deco2(info):
def info_decorator(func):
def func_wrapper(name):
return func(name) + info
return func_wrapper
return info_decorator
@deco2(", how are you?")
def foo2(name):
return "Hello "+name
print(foo2("Regina"))
给予
Hello Regina, how are you?
处理这个装饰器的“规则”是什么?
似乎,不是返回foo2,Python 首先使用给定的 arg 调用 deco2,并且假设,此调用首先构造装饰器的工厂,然后像以前一样将 foo2 传递给它以返回最终的包装器。但是,在这种情况下,涉及到一个额外的“层”(三个定义而不是两个),这让我很难确定一般规则。
【问题讨论】:
-
你的第二个装饰器相当于:
foo2 = deco2(", how are you?")(foo2)放在foo2之后。 -
我知道,但在第一种情况下,它只是:
foo = deco(foo)放在 foo 之后。是装饰器中 Python 知道要添加额外间接的参数吗?