gpt4 book ai didi

python - 如何避免在必须尝试 : instead of if-elsif 的情况下增加缩进

转载 作者:太空狗 更新时间:2023-10-30 02:43:06 25 4
gpt4 key购买 nike

我有一系列条件,在尝试“pythonic 风格”时只能通过异常进行测试:

def getGrok(x):
try: # is x referring to a snood?
s = makeSnood(x)
grokster = s.snoodidle()
except ValueError:
try: # is x referring to a trund?
t = makeTrund(x)
grokster = t.trundle()
except ValueError:
try: # maybe too deep?
d = makeTooDeep(x)
grokster = d.groan()
except ValueError:
grokster = None

if grokster:
return grokster.grok()
else:
return None

这里只有三种可能性,而且已经太深了。

让我觉得必须有更好的方法。如果没有这个嵌套树,你怎么能做这个逻辑?

最佳答案

在您的示例中,后面的尝试似乎并不真的需要嵌套在前面的尝试中。您基本上只是进行了三次单独的尝试。它们有一个顺序,但它们不必嵌套。所以你可以做类似的事情

grokster = None
try: # is x referring to a snood?
s = makeSnood(x)
grokster = s.snoodidle()
except ValueError:
pass

if grokster is None:
try: # is x referring to a trund?
t = makeTrund(x)
grokster = t.trundle()
except ValueError:
pass

if grokster is None:
try: # is x referring to a trund?
d = makeTooDeep(x)
grokster = d.groan()
except ValueError:
pass

if grokster:
return grokster.grok()
else:
return None

如果您无法从所有尝试都失败的情况中“恢复”,那么您可以在最后执行 raise GroksterError("Don't know how to制作 x"的 grokster

当然,如果你有很多这样的东西,你可能可以分解出其中的一些逻辑,例如通过列出“创造者”(makeSnoodmakeTrund 等)及其对应的方法(snoodidletrundle 等),以便您可以遍历此列表并为每次尝试运行相同的逻辑.但是,对于像这样的简单案例(只有三件事要尝试),这可能会使代码更加困惑。此外,在实践中我发现,如果你正在做这样的异质尝试,那么你对它们的处理通常也是异质的(例如,你可能会根据成功的尝试做不同的事情);在这种情况下,对于一般解决方案,您必须通过将每次尝试的“设置”拉出到一个单独的函数中来进一步拆分,以便您可以调用它。

关于python - 如何避免在必须尝试 : instead of if-elsif 的情况下增加缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34560635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com