关于python:如何在另一个函数中创建一个函数一次退出两个函数?

How to make a function inside another function quit both functions at once?

我正在制作一个程序,它向用户询问一些问题,并使用不同的函数对用户输入的内容做出反应。我需要这样做,如果用户输入"cancel",它不仅会结束他们当前所在的函数,甚至会结束调用先前函数的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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后停止。有什么想法吗?

所以期望的输出是。

1
2
#30
#10

编辑:这是一个非常简化的版本,他们不会在这个特定的代码中输入cancel。它将在一个raw_input中。


提升exception会像您描述的那样退出函数堆栈。所以您可以拥有最外层的函数try-expect所有内部函数。如果任何一个内部函数引发一个exception,它将冒泡(即不会执行堆栈中的任何后续代码),直到到达最外层函数的except

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

如果不想更改函数的内容,可以使用下面的修饰器。还有评论中提到的修正。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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