Code Explanation:
1️⃣ Creating the Decorator
def dec(f):
dec() is a decorator function.
It accepts another function as its argument.
Here, f will eventually refer to the original calc() function.
2️⃣ Creating the Wrapper
def wrapper(**kwargs):
wrapper() accepts keyword arguments using **kwargs.
For this call:
calc(a=3, b=4)
the arguments are collected into a dictionary-like structure:
kwargs = {
"a": 3,
"b": 4
}
3️⃣ Passing kwargs to the Original Function
return f(**kwargs) + 10
The ** operator unpacks the keyword arguments.
So:
f(**kwargs)
becomes:
f(a=3, b=4)
Since f refers to calc():
calc(a=3, b=4)
is executed.
4️⃣ Calculating a * b
def calc(a, b):
return a * b
The values are:
a = 3
b = 4
Therefore:
3 × 4 = 12
So the original function returns:
12
5️⃣ Adding 10
The wrapper contains:
return f(**kwargs) + 10
The original result is:
12
Then:
12 + 10 = 22
Therefore, wrapper() returns:
22
6️⃣ Returning the Wrapper
return wrapper
The decorator returns the wrapper function.
Because of the decorator syntax:
@dec
def calc(a, b):
Python effectively performs:
calc = dec(calc)
So after decoration, the name calc refers to wrapper.
7️⃣ Calling calc()
print(calc(a=3, b=4))
Although it looks like we're directly calling the original calc(), after decoration we're actually calling:
wrapper(a=3, b=4)
The flow becomes:
calc(a=3, b=4)
↓
wrapper(**kwargs)
↓
f(a=3, b=4)
↓
3 × 4
↓
12
↓
12 + 10
↓
22
๐ Step-by-Step Values
Step Value
a 3
b 4
f(a=3,b=4) 12
Decorator adds 10
Final result 22
๐ฏ Final Output
22

0 Comments:
Post a Comment