如何使用Python装饰器使函数短路?

如何使用Python装饰器使函数短路?,python,python-3.x,decorator,python-decorators,Python,Python 3.x,Decorator,Python Decorators,假设我有一个函数F,它可能返回布尔值false。如果我有一个名为main的调用程序,它将在多个位置调用F,那么我是否可以在F上附加一个decorator,以传播返回值并使其父main也提前退出?没有函数可以“返回”到比其调用程序更高的上下文。据我所知,这在大多数编程语言中是通用的。您可能可以通过检查python状态和调用堆栈来破解它,但更好/更合适的解决方案是将main封装在try:except:block中,该块捕获您在此装饰器中根据F的输出引发的自定义异常 这就是我一直在寻找的一种解决方案,

假设我有一个函数F,它可能返回布尔值false。如果我有一个名为main的调用程序,它将在多个位置调用F,那么我是否可以在F上附加一个decorator,以传播返回值并使其父main也提前退出?

没有函数可以“返回”到比其调用程序更高的上下文。据我所知,这在大多数编程语言中是通用的。您可能可以通过检查python状态和调用堆栈来破解它,但更好/更合适的解决方案是将main封装在try:except:block中,该块捕获您在此装饰器中根据F的输出引发的自定义异常


这就是我一直在寻找的一种解决方案,我不必为f:谢谢!
import random
from functools import wraps

class ShortCircuit(Exception):
    pass

def short_circuit(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        res = f(*args, **kwargs)
        if not res:
            raise ShortCircuit()
        else:
            return res
    return wrapped

@short_circuit
def F():
    return random.choice([True, False])

def main():
    print(F())
    print(F())

if __name__=="__main__":
    try:
        main()
    except ShortCircuit:
        print("short circuited")