装饰过的函数调用另一个装饰器函数会正常返回吗?

1 投票
1 回答
860 浏览
提问于 2025-04-17 22:49

装饰器的控制流程是怎么运作的?有没有办法让我修改叫做 `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

为了避免被调用的函数干扰流程,导致无法返回到调用它的函数,你需要对调用栈做一些复杂的操作。所以我觉得你不需要担心这个问题。

如果你没有触发第二个调试点,可能是你被调用的函数里面发生了什么事情。

撰写回答