gpt4 book ai didi

python - 有没有比 `except: pass` 更简洁的替代品?

转载 作者:太空狗 更新时间:2023-10-29 21:17:54 25 4
gpt4 key购买 nike

我有一个函数可以按偏好顺序返回几个组中的随机成员。它是这样的:

def get_random_foo_or_bar():
"I'd rather have a foo than a bar."

if there_are_foos():
return get_random_foo()

if there_are_bars():
return get_random_bar()

raise IndexError, "No foos, no bars"

但是,get_random_foo 做的第一件事是验证是否存在 foo,如果没有则引发 IndexError,因此 there_are_foos 是多余的。此外,涉及数据库并且使用单独的函数会产生并发问题。因此,我将其重写如下:

def get_random_foo_or_bar():
"Still prefer foos."

try:
return get_random_foo()
except IndexError:
pass

try:
return get_random_bar()
except IndexError:
pass

raise IndexError, "No foos, no bars"

但我发现它的可读性要差得多,因为我从来没有理由使用 pass 之前感觉它是本能的错误。

是否有更简洁高效的模式,或者我应该学会接受 pass

注意:我想避免任何嵌套,因为以后可能会添加其他类型。


编辑

感谢所有说 pass 没问题的人 - 这让人安心!

同时感谢那些建议将异常替换为返回值 None 的人。我可以看出这是一个有用的模式,但我认为在这种情况下它在语义上是错误的:函数被要求执行一项不可能完成的任务,因此它们应该引发异常。我更喜欢遵循 ​​random 模块的行为(例如 random.choice([]))。

最佳答案

这正是我要写的。这很简单,也很有意义。我认为 pass 语句没有问题。

如果您想减少重复并预计会添加 future 的类型,您可以将其卷入一个循环中。然后,您可以将 pass 更改为功能等效的 continue 语句,如果这样更合您的口味:

for getter in (get_random_foo, get_random_bar):
try:
return getter()
except IndexError:
continue # Ignore the exception and try the next type.

raise IndexError, "No foos, no bars"

关于python - 有没有比 `except: pass` 更简洁的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3723302/

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