在Python中,我对decorators略知一二。 在我的理解中,修饰函数声明返回修饰函数与原始函数一起构造的任何内容(最合理地说,这应该是可调用的):
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
,假设,这个调用首先为decorator构造一个工厂,然后像以前一样传递foo2给它,以返回最终的包装器。然而,在这种情况下,还有一个额外的“层”(三个def而不是两个def),这使我很难确定一般规则。你知道吗
如果应用decorator而不使用参数,例如
@foo
,那么decorator将被修饰的函数作为其参数,并期望返回将替换修饰函数的任何可调用函数。你知道吗如果使用参数应用decorator,例如
@foo('bar')
,那么decorator将返回一个可调用函数,该函数将以decorated函数作为其参数,并返回和可调用函数,该函数将替换decorated函数。你知道吗换句话说:没有参数的decorator只需要被修饰的函数,但是有参数的decorator需要自己的参数和它需要以某种方式获得被修饰的函数。由于decorator的参数是任意的,并且没有任何限制,因此很难提出任何非限制性的规则来另外将decorator传递给它。在这种情况下,将应用两个步骤:获取decorator参数,然后返回另一个接受decoratee的callable。你知道吗
相关问题 更多 >
编程相关推荐