我想知道是否有一种很好的方法告诉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 (...)
它看起来有点不那么凌乱,但我不得不一次又一次地重复返回声明,这是一个令人讨厌的东西,如果它是一个长元组或类似它甚至看起来更糟。 完美的解决方案是说“如果没有条件,请跳到最终的退货声明”。这有可能吗?
编辑:明确这一点:我的目标是提高可读性,同时避免性能下降
答案 0 :(得分:5)
我想我会创建一个函数列表(我假设你的例子中的所有do(stuff)
实际上都是不同的函数)。然后你可以使用for
循环:
list_of_funcs = [func1, func2, func3]
for func in list_of_funcs:
func(stuff)
if not condition:
break
return (...)
如果条件不同,那么您还可以创建条件列表(这将是返回True
或False
的函数列表),然后您可以使用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:从这两个中,第一个可能更好,因为它明确表明没有循环意图。