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