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

时间:2019-02-12 19:04:40

标签: python python-3.x decorator python-decorators

说我有一个函数F,该函数可能返回布尔值false。如果我有一个名为main()的调用方,它将在多个位置调用F,是否可以在F上附加一个装饰器,该装饰器将传播返回值并导致其父级(主)也提前退出?

1 个答案:

答案 0 :(得分:1)

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