传参机制

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

results matching ""

    No results matching ""