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

时间:2014-03-18 14:51:00

标签: python decorator

在装饰器的情况下,控制流程如何工作?无论如何我可以修改calleedec并使其在被调用后不返回调用者?这不是我想要的场景我看到一个类似的错误,所以想知道这是否可能? 它不像普通的功能一样吗?

尝试调试问题 - 我们点击第一个pdb而不是第二个pdb,如下面的场景中那样?

两者都是装饰功能。

@cooldec()
def caller():
    import pdb;pbd.set_trace()  # Hits here
    callee()
    import pdb;pdb.set_trace() # Not here

@calleedec()
def callee():
    return "Okay

编辑:

提升错误是一种情况,但没有错误跟踪。

我可以看到一个案例,其中被调用者的装饰者处于无限循环中或者无法完成其工作(花费很长时间),这种情况可能发生。

1 个答案:

答案 0 :(得分: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

为了避免被叫方劫持流而不返回调用者函数,你需要对堆栈做一些严肃的黑魔法。所以我不认为你应该为此担心。

如果你没有点击第二个pdb断点,你的被叫函数可能会发生一些事情。