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