Python:如果条件然后跳过返回

时间:2016-10-06 13:26:56

标签: python return indentation

我想知道是否有一种很好的方法告诉python解释器跳到函数的下一个/最后一个返回语句

让我们假设以下虚拟代码:

def foo(bar):
  do(stuff)

  if condition:
    do(stuff)
    if condition2:
      do(stuff)
      if condition3:
        ...

  return (...)

有时候,由于它们依赖于上面的do(stuff)块,因此很多条件无法链接。我现在可以这样做:

def foo(bar):
  do(stuff)

  if not condition: return (...)
  do(stuff)
  if not condition2: return (...)
  do(stuff)
  if not condition3: return (...)
    ...

  return (...)

它看起来有点不那么凌乱,但我不得不一次又一次地重复返回声明,这是一个令人讨厌的东西,如果它是一个长元组或类似它甚至看起来更糟。 完美的解决方案是说“如果没有条件,请跳到最终的退货声明”。这有可能吗?

编辑:明确这一点:我的目标是提高可读性,同时避免性能下降

3 个答案:

答案 0 :(得分:5)

我想我会创建一个函数列表(我假设你的例子中的所有do(stuff)实际上都是不同的函数)。然后你可以使用for循环:

list_of_funcs = [func1, func2, func3]
for func in list_of_funcs:
    func(stuff)
    if not condition:
        break
return (...)

如果条件不同,那么您还可以创建条件列表(这将是返回TrueFalse的函数列表),然后您可以使用zip以下方式:

list_of_funcs = [func1, func2, func3]
list_of_conditions = [cond1, cond2, cond3]
for func, cond in zip(list_of_funcs, list_of_conditions):
    func(stuff)
    if not cond():
        break
return (...)

这样,无论您有多少功能和条件,您的实际代码都会保持相同的长度和相同的缩进级别。

答案 1 :(得分:0)

重构代码是一个很多更好的想法,而不是我建议的,但这是一个选项。

class GotoEnd(Exception):
    pass

def foo(bar):

  try:
    do(stuff)
    if not condition: raise GotoEnd
    do(stuff)
    if not condition2: raise GotoEnd

    do(stuff)
    if not condition3: raise GotoEnd

    ...
  except GotoEnd:
    pass

  return (...)

答案 2 :(得分:0)

我建议这样做:

def foo(bar):

  for __ in [0]:
     do(stuff)

     if not condition: continue
     do(stuff)
     if not condition2: continue
     do(stuff)
     if not condition3: continue
     ...

  return (...)

或者可能:

def foo(bar):

  while True:
     do(stuff)

     if not condition: break
     do(stuff)
     if not condition2: break
     do(stuff)
     if not condition3: break
     ...
     break
  return (...)

它更简洁,避免了多次返回:+1:从这两个中,第一个可能更好,因为它明确表明没有循环意图。