当有多个if语句时,只保留一个函数的一个出口

时间:2012-01-13 09:51:34

标签: python

当一个函数包含多个if语句时,保持一个退出似乎是一个好习惯。在类似php的语言中,我可以使用do-while(false),如下所示:

function a() {
    do {
        if (...) break;
        ...
        if (...) break;
        ...
    } while (FALSE);
    ...
    return;
}

如何在python中执行此操作?虽然我可以使用while(true),但如果错过了尾随中断,它将是一个死循环。

while True:
    if ...: break
    ...
    if ...: break
    ...
    # oops, miss the 'break', you're dead

有更多的pythonic方法吗?

PS:进一步说明一出口:

function a() {
    if (...) { $a = 1; log($a); return $a; }
    if (...) { $a = 2; log($a); return $a; }
    if (...) { $a = 3; log($a); return $a; }
}

function a() {
    do {
        if (...) { $a = 1; break; }
        if (...) { $a = 2; break; }
        if (...) { $a = 3; break; }
    } while (FALSE);
    log($a);
    return $a;
}
希望你看到差异......

4 个答案:

答案 0 :(得分:3)

我认为while循环是一种尴尬的方式来实现您正在寻找的东西。为什么不使用局部变量?

def f(x):
  result = None

  if (...): result = 1
  elif (...): result = 2
  elif (...): result = 3
  else: result = 4

  log(result)
  return result

答案 1 :(得分:3)

要在Python中执行此操作,我会这样写(请参阅Defining cleanup actions):

try:
    if ...: return
    ...
    if ...: return
    ...
finally:
    #Code to be executed on every return path (including exceptions) here

答案 2 :(得分:1)

实现你提到的目标的更多Pythonic方法 - 记录返回值 - 是将整个函数包装在装饰器中。例如:

from functools import wraps

def print_return(fn):
    @wraps(fn)
    def wrapped(*args, **kwargs):
        return_value = fn(*args, **kwargs)
        print return_value
        return return_value
    return wrapped


@print_return
def foo(a, b):
    return a + b

答案 3 :(得分:-1)

你可以用try,catch来做。你只需要引发异常而不是中断

请参阅此页:

http://docs.python.org/tutorial/errors.html