Decorated functions are just plain functions, and have nothing special to them regarding program flow.
When in doubt, try to expand the decorator and see if that is clearer:
def calleedec(callee_fn):
def wrapped():
print("Running the callee")
callee_fn()
return wrapped
def callee():
return "Okay"
callee = calleedec(callee)
def cooldec(fn):
def wrapped():
print("Running the caller")
return fn()
return wrapped
@cooldec
def caller():
print("caller: start")
callee()
print("caller: end")
caller()
# Running the caller
# caller: start
# Running the callee
# caller: end
To avoid the callee hijacking the flow and not returning to the caller function you would need to do some serious black magic with the stack. So I don't think you should worry about this.
If you are not hitting the second pdb breakpoint, something may be happening in your callee function.