我知道“tryelse”不是真实的东西,但我的问题是关于写出此逻辑的最佳方式。在以下示例中,foo 和 bar 是可能会中断的函数。
我希望 aa
成为 foo()
,但如果它中断,我希望它成为 bar()
,但如果那一个也中断,然后将 aa
设置为默认值 0。
try:
aa = foo()
elsetry:
aa = bar()
except e:
aa = 0
重申我的问题,用 Python 编写此逻辑的最佳实际方法是什么?
最佳答案
如果您有一长串这些,或者有一个动态备选方案列表,您可能想要使用for
循环:
for func in funcs:
try:
aa = func()
break
except:
pass
else:
aa = 0
请注意,无论哪种方式,您可能都不真的想要一个空的except
。通常你只期待一些特定类别的错误(例如,ValueError
或 LookupError
),其他任何事情都不应该意味着“默默地尝试下一个”,而是“显示出乎意料的错误的程序员”。但您知道如何解决这个问题。
如果您需要重复使用它,您当然可以将其包装在一个函数中:
def try_funcs(*funcs, defval=0, ok_exceptions=Exception):
for func in funcs:
try:
return func()
except ok_exceptions: # ok_exceptions can also be a tuple of exception classes.
pass
return defval
当然,如评论中所述,这确实要求您要尝试的所有内容都是无参数的函数。如果你想尝试 spam(42)
,如果失败则尝试 eggs(beans)
怎么办?或者甚至不是函数调用而是一些其他表达式的东西,比如 foo[bar]
?
这与 Python 中出现的一般情况相同:您使用 partial
绑定(bind)第一种情况的参数,或者使用 lambda
编写包装函数第二个:
result = try_funcs(partial(spam, 42), partial(eggs, beans), lambda: foo[bar])
但是,如果您只有两个或三个静态替代方案可以尝试,Simon Visser's simple nested answer清晰多了。
如果您问为什么该语言没有您的tryelse
……好吧,我知道它出现在 python-ideas/-dev 列表和其他地方几次,并被讨论过,所以你可能想搜索更详细/权威的答案。但我认为这归结为:虽然理论上可以提出使用 tryelse
看起来更干净的案例,但任何人给出的每个示例要么按原样好,要么显然应该重构, 因此没有令人信服的理由来改变语法、保留新关键字等。
关于python - 在 python 中编写 "try elsetry"的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325666/