当你不知道如何准确描述这个问题时,很难找到这个问题的答案......
处理相当深(但固定)的嵌套测试集(您希望按顺序运行但在第一个测试得出成功结果后立即终止)的最惯用方法是什么?
代替下面的
选项 1:(导致缩进过多)
def make_decision():
results = ... some code or function that returns a list or None
if results:
decision = random.choice(results)
else:
results = ... other code or function
if results:
decision = random.choice(results)
else:
results = ... other code or function
if results:
decision = random.choice(results)
else:
results = ... other code or function
if results:
decision = random.choice(results)
...etc.
else:
decision = None
print(decision)
return decision
选项2
另一种选择是尽早从函数返回,但我不确定分散这么多返回是否是一个好习惯,在这种情况下,我更愿意在返回之前在最后做最后一件事(例如
print(decision)
):
def make_decision():
results = ... some code or function that returns a list or None
if results:
return random.choice(results)
results = ... other code or function
if results:
return random.choice(results)
results = ... other code or function
if results:
return random.choice(results)
...etc.
return None
选项3
最后,我可以使每个测试成为一个单独的函数如此处所述并迭代调用它们,前提是每个测试函数具有相同的参数集。
def test1(args):
...
def test2(args):
...
def test3(args):
...
def make_decision():
decision = None
for test in [test1, test2, test3, ...]:
results = test(args)
if results:
decision = random.choice(results)
break
print(decision)
return decision
这看起来是最好的,但我并没有计划为每个测试创建一个函数,有些测试可以使用相同的函数但使用不同的参数来完成,有些只是单行,而另一些是多行。 那么在开始循环之前我是否必须构建函数和参数列表? 或者列出
partial
函数?
欢迎任何更好的建议(在我继续上面的选项 3 之前)
更新2018-07-21:
未来的潜在选择
当我正在努力解决这个问题时,我不知道的是,PEP 572 获得了批准(范罗苏姆先生因此辞职)。 如果实施此 PEP,我认为以下解决方案也是可能的:
def make_decision():
if (results := ... some code or function) is not None:
decision = random.choice(results)
elif (results := ... some code or function) is not None:
decision = random.choice(results)
...etc.
else:
decision = None
return decision
您可以选择任何选项,这完全取决于您的喜好。对于选项 2,我认为拥有许多
return
并不是一个坏主意,因为它们包含在条件代码中。仅当条件为 True
时才会执行它们。
在选项 1 中,您可以决定切换到
elif results:
而不是:
if results:
# some code
else:
if results:
# some code
在您的代码中,您似乎正在检查相同的
results
,看起来只有一个 if
块会执行。您应该检查某些值,例如if results == something
。
最后,选项 3 看起来更干净。最后,选择您感觉最舒服的一个。
不确定当缩进的代码只执行一次时使用 while 是否合适,但它允许在找到结果时使用break命令终止:
def make_decision():
while True:
results = ... some code or function that returns a list or None
if results is not None:
break
results = ... other code or function
if results is not None:
break
...etc.
results = ... other code or function
break
if results is None:
decision = None
else:
decision = random.choice(results)
print(decision)
return decision
我在
这个答案中使用
for _ in (True,)
找到了另一个例子
抱歉,现在再看一遍就很明显了:
def make_decision():
results = ... some code or function that returns a list or None
if results is None:
results = ... other code or function
if results is None:
results = ... other code or function
...etc.
if results is None:
decision = None
else:
decision = random.choice(results)
print(decision)
return decision