gpt4 book ai didi

python - 如何处理列表推导中的异常?

转载 作者:IT老高 更新时间:2023-10-28 21:10:05 30 4
gpt4 key购买 nike

我在 Python 中有一些列表理解,其中每次迭代都可能引发异常。

例如,如果我有:

eggs = (1,3,0,3,2)

[1/egg for egg in eggs]

我会在第三个元素中得到一个 ZeroDivisionError 异常。

如何处理此异常并继续执行列表推导?

我能想到的唯一方法是使用辅助函数:

def spam(egg):
try:
return 1/egg
except ZeroDivisionError:
# handle division by zero error
# leave empty for now
pass

但这对我来说有点麻烦。

有没有更好的方法在 Python 中做到这一点?

注意:这是我设计的一个简单示例(参见上面的“例如”),因为我的真实示例需要一些上下文。我对避免除以零错误不感兴趣,但对处理列表理解中的异常不感兴趣。

最佳答案

我意识到这个问题已经很老了,但你也可以创建一个通用函数来简化这种事情:

def catch(func, handle=lambda e : e, *args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
return handle(e)

那么,按照你的理解:

eggs = (1,3,0,3,2)
[catch(lambda : 1/egg) for egg in eggs]
[1, 0, ('integer division or modulo by zero'), 0, 0]

您当然可以随意设置默认句柄函数(假设您希望默认返回 'None')。

希望这对您或此问题的任何 future 观众有所帮助!

注意:在 python 3 中,我将只制作“handle”参数关键字,并将其放在参数列表的末尾。这将使实际通过 catch 传递参数等更加自然。

更新(9 年后...):对于 Python 3,我的意思是切换 *argshandle,因此您可以为函数指定参数而无需指定处理。一个小小的便利:

def catch(func, *args, handle=lambda e : e, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
return handle(e)

这在理解中使用定义的函数时很有帮助:

from math import log    
eggs = [1,3,0,3,2]
[catch(log, egg) for egg in eggs]
[0.0, 1.0986122886681098, ValueError('math domain error'), 1.0986122886681098, 0.6931471805599453]

在 Python 2 版本下,我们必须在 egg 之前传入 handle

关于python - 如何处理列表推导中的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1528237/

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