如何在另一个函数内部创建一个函数同时退出这两个函数?

时间:2018-05-19 06:55:57

标签: python python-2.7 function

我正在制作一个程序,询问用户一些问题,并使用不同的功能来响应用户输入的内容。我需要这样做,如果用户输入"取消",它不仅会结束他们当前所处的功能,甚至还会调用调用先前功能的功能。

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

1 个答案:

答案 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