Home > Software engineering >  Chaining decorators result is confusing me
Chaining decorators result is confusing me

Time:07-30

def decor1(func):
    def inner():
        x = func()
        return x * x
    return inner
 
def decor(func):
    def inner():
        x = func()
        return 2 * x
    return inner
 
@decor1
@decor
def num():
    return 10
 
print(num())

Can someone explain why the result is 400? Is it because inner is being returned twice? I'm learning chaining decorators but it's a bit confusing at first glance.

CodePudding user response:

The num function returns 10, which is then passed to decor (one level higher) in variable x (note that func() refers to num(), hence it returns 10). x is multiplied by 2, yielding 20. The 20 is passed to decor1 (another level higher) in variable x and is multiplied by itself, so 20 times 20 yields 400.

CodePudding user response:

The first decorator applied is @decor, so at this stage your num function will return 2*10. Then @decor1 is applied so in the end num returns (2*10)*(2*10) which is 400.

  • Related