Python 如何使一个函数在另一个函数中同时退出这两个函数?
我正在制作一个程序,询问用户一些问题,并使用不同的功能对用户提供的输入做出反应。我需要这样做,如果用户曾经键入“Cancel”,它不仅会结束他们当前使用的函数,甚至会结束调用先前函数的函数Python 如何使一个函数在另一个函数中同时退出这两个函数?,python,python-2.7,function,Python,Python 2.7,Function,我正在制作一个程序,询问用户一些问题,并使用不同的功能对用户提供的输入做出反应。我需要这样做,如果用户曾经键入“Cancel”,它不仅会结束他们当前使用的函数,甚至会结束调用先前函数的函数 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 #
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
编辑:这是一个极其简化的版本,他们不会在这个特定的代码中键入cancel。它将在
原始输入中
引发异常
退出函数堆栈,就像您描述的那样。因此,您可以使用最外层的函数try expect
所有内部函数。如果任何内部函数引发异常
,它将冒泡(即它不会执行堆栈中的任何后续代码),直到到达除之外的最外层函数的
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<但是,code>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
抛出异常并捕获它?使用“type”将如何取消?“它们当前处于”:用户处于函数中意味着什么?这对我来说毫无意义。为什么不为您提到的输入提供示例代码?您确定
raise(“Foo”)
是有效的Python吗?raise
不是一个函数,而是一个语句,应该作为raiseexception()
调用-它只在您的示例中起作用,因为(…)
被视为一个分组语句。另外,使用除之外的普通捕获所有异常是一种不好的做法,因为它将捕获键盘中断和其他系统/意外异常,而在大多数情况下,您不希望这样捕获这些异常。@zwer。此外,我还建议定义一个自定义标签类型,如class UserPressedCancel(Exception):pass
,这样可以避免捕获意外异常类型所引起的任何复杂情况。谢谢。语法错误对我来说并不明显!