当您完全不知道如何描述该问题时,很难找到答案。
处理一组相当深(但固定)的嵌套测试的最惯用的方法是什么?这些测试要按顺序运行,但是在第一个测试成功后立即终止?
代替以下
选项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.
else:
decision = None
return decision
选项3
最后,只要每个测试函数具有相同的参数集,我就可以使每个测试成为一个单独的函数as described here并进行迭代调用。
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
答案 0 :(得分:0)
您可以选择任何选项,这完全取决于您的偏好。对于选项2,我认为拥有许多return
并不是一个坏主意,因为它们被包含在条件代码中。仅当该条件为True
时,它们才会执行。
在选项1上,您可以决定切换到elif results:
,而不是:
if results:
# some code
else:
if results:
# some code
在您的代码中,几乎好像您正在检查相同的results
,看起来只执行一个if
块。您应该检查一些值,例如if results == something
。
最后,选项3看起来更干净。总结一下,选择最适合自己的一种。
答案 1 :(得分:-2)
对不起,现在重新看一下就很明显了:
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