装饰过的函数调用另一个装饰器函数会正常返回吗?
装饰器的控制流程是怎么运作的?有没有办法让我修改叫做 `calleedec` 的函数,让它在被调用后不返回给调用者?这不是我想要的情况,我看到类似的bug,所以想知道这是否可能? 这不就像普通函数吗?
我正在调试一个问题——我们在下面的场景中遇到了第一个断点,但没有遇到第二个断点?
这两个函数都是被装饰的。
@cooldec()
def caller():
import pdb;pbd.set_trace() # Hits here
callee()
import pdb;pdb.set_trace() # Not here
@calleedec()
def callee():
return "Okay
编辑:
抛出错误是一种情况,但没有错误追踪。
我可以想象一种情况,就是被调用函数的装饰器陷入了无限循环,或者无法完成它的工作(花费了很长时间),这种情况是有可能发生的。
1 个回答
2
被装饰的函数其实就是普通的函数,跟程序的执行流程没有什么特别的关系。
如果你不太明白,可以试着把装饰器展开,看看这样是否更清楚:
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
为了避免被调用的函数干扰流程,导致无法返回到调用它的函数,你需要对调用栈做一些复杂的操作。所以我觉得你不需要担心这个问题。
如果你没有触发第二个调试点,可能是你被调用的函数里面发生了什么事情。