传参机制
Python解释器中,对加上了参数的装饰器多做了一层封装,也就是说上面传入参数的hello_world函数执行的时候等价于下面这段代码:
@mydec(type_='test')
def helloWorld():
print('hello, world')
cur1 = mydec(type_)
cur2 = cur1(hello_world)
cur2()
正是因为额外多封装了一层,所以函数和装饰器的参数传入装饰器的顺序是不同的,顺序也是不一样的。明白了这点之后就简单很多了,既然Python解释器在解释装饰器参数的时候多增加了一层,那么如果我们想要实现带参数的装饰器,只需要也在装饰器当中多封装一层就可以了。比如可以写成这样:
def mydec(type_=None):
def decorate(func):
@wraps(func)
def mywrap():
if type_ is not None:
print(type_)
func()
return mywrap
return decorate