我正在制作一个程序,询问用户一些问题,并使用不同的功能来响应用户输入的内容。我需要这样做,如果用户输入"取消",它不仅会结束他们当前所处的功能,甚至还会调用调用先前功能的功能。
def func1(x):
func2(x+5)
print 5
def func2(x):
func3(x+5)
print 5
def func3(x):
print x
return
func1(20)
print 10
# 30
# 5
# 5
# 10
所以目前这将打印30,退出func3,打印5,退出func2,打印5,退出func1。我需要一种方法让它在func3打印30后停止。任何想法?
所以期望的输出就是。
#30
#10
编辑:这是一个极其简化的版本,他们不会在此特定代码中键入取消。它将在raw_input
。
答案 0 :(得分:3)
提升exception
就像你描述的那样退出函数堆栈。因此,您可以拥有最外层函数try-expect
所有内部函数。如果任何内部函数引发exception
,它将冒泡(即它不会执行堆栈中的任何后续代码),直到它到达最外层函数的except
。
def func1(x):
try:
func2(x+5)
print 5
except:
pass
def func2(x):
func3(x+5)
print 5
def func3(x):
print x
raise("Foo") # user's input should drive this.
return
func1(20)
print 10
以正常方式到达func3
。但是func3
表示它不希望正常的执行流程func2
将其级联到func1
。
如果您不想更改功能的内容,可以使用以下装饰器。它还有评论中提到的更正。
class UserAbort(Exception):
pass
def swallow(f):
def wrapper(*args):
try:
f(*args)
except UserAbort:
pass
return wrapper
@swallow
def func1(x):
func2(x+5)
print 5
def func2(x):
func3(x+5)
print 5
def func3(x):
print x
raise UserAbort # user's input should drive this.
return
func1(20)
print 10