yur*_*uri 1 python exception list cycle
我有一个列表推导过滤列表:
l = [obj for obj in objlist if not obj.mycond()]
Run Code Online (Sandbox Code Playgroud)
但是对象方法mycond()可以引发一个我必须拦截的异常.我需要收集循环结束时的所有错误,以显示哪个对象创建了任何问题,同时我想确保循环所有列表元素.
我的解决方案是:
errors = []
copy = objlist[:]
for obj in copy:
try:
if (obj.mycond()):
# avoiding to touch the list in the loop directly
objlist.remove(obj)
except MyException as err:
errors = [err]
if (errors):
#do something
return objlist
Run Code Online (Sandbox Code Playgroud)
在这篇文章中(如何在循环列表本身时删除列表元素而不重复它)我问是否有更好的方法来循环避免列表重复.
社区回答我,以避免列表修改,并使用适用的列表推导,如果我忽略异常问题.
在您的观点中是否有替代解决方案?我可以使用列表推导以这种方式管理异常吗?在这种情况下并使用大名单(我必须考虑哪些大?)我必须找到另一种选择?
我会用一点辅助功能:
def f(obj, errs):
try: return not obj.mycond()
except MyException as err: errs.append((obj, err))
errs = []
l = [obj for obj in objlist if f(obj, errs)]
if errs:
emiterrorinfo(errs)
Run Code Online (Sandbox Code Playgroud)
请注意,这样您就可以在errs
所有错误对象和每个错误对象中对应的特定异常,因此诊断可以准确和完整; 以及l
您需要的,并且您objlist
仍然可以继续使用.不需要列表副本,也不需要对obj
类进行任何更改,代码的整体结构非常简单.