Python 如何使一个函数在另一个函数中同时退出这两个函数?

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 #

我正在制作一个程序,询问用户一些问题,并使用不同的功能对用户提供的输入做出反应。我需要这样做,如果用户曾经键入“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
# 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
,这样可以避免捕获意外异常类型所引起的任何复杂情况。谢谢。语法错误对我来说并不明显!