【发布时间】:2019-02-12 19:04:39
【问题描述】:
假设我有一个函数 F,它可能返回布尔值 false。如果我有一个名为 main() 的调用者会在多个地方调用 F,我是否可以将一个装饰器附加到 F 以传播返回值并导致其父 (main) 也提前退出?
【问题讨论】:
标签: python python-3.x decorator python-decorators
假设我有一个函数 F,它可能返回布尔值 false。如果我有一个名为 main() 的调用者会在多个地方调用 F,我是否可以将一个装饰器附加到 F 以传播返回值并导致其父 (main) 也提前退出?
【问题讨论】:
标签: python python-3.x decorator python-decorators
没有函数可以“返回”到高于其调用者的上下文。这(据我所知)在大多数编程语言中都是通用的。您可能可以通过检查 python 状态和调用堆栈来破解它,但更好/更合适的解决方案是将 main 包装在 try: except: 块中,该块捕获您在此装饰器中引发的自定义异常,具体取决于 @ 的输出987654322@
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")
【讨论】: