【发布时间】:2014-03-25 20:01:51
【问题描述】:
我有一个需要根据key function 排序的对象列表。问题是我列表中的某些元素在列表排序时可能会“过时”。当对此类过期项目调用 key 函数时,它会失败并出现异常。
理想情况下,我想要一种使用键函数对列表进行排序的方法,这样当在元素上调用键函数时发生错误时,该元素会从排序结果中排除。
我的问题可以用下面的例子来重构:假设我有两个类,Good 和 Bad:
class Good(object):
def __init__(self, x):
self.x = x
def __repr__(self):
return 'Good(%r)' % self.x
class Bad(object):
@property
def x(self):
raise RuntimeError()
def __repr__(self):
return 'Bad'
我想根据它们的x 属性对这些类的实例进行排序。例如:
>>> sorted([Good(5), Good(3), Good(7)], key=lambda obj: obj.x)
[Good(3), Good(5), Good(7)]
现在,当我的列表中有Bad 时,排序失败:
>>> sorted([Good(5), Good(3), Bad()], key=lambda obj: obj.x)
... RuntimeError
我正在寻找一个神奇的函数func,它根据键函数对列表进行排序,但只是忽略键函数引发错误的元素:
>>> func([Good(5), Good(3), Bad()], key=lambda obj: obj.x)
[Good(3), Good(5)]
实现这一点的最 Pythonic 方式是什么?
【问题讨论】:
-
Bad.x是否真的在被要求时提出RuntimeError还是只是提出AttributeError? -
我很好奇你的对象为什么会过期。它是另一个线程,在您排序时修改您的对象吗?还是它们真的会因为时间的流逝而过期?但是,为什么这会使属性引发异常?例如,将属性
Apple.age提升为TooOldException是不明智的。 -
@Kevin,对象过期是因为它们代表打开的浏览器窗口(=另一个进程)中的(Selenium)网络元素。如果例如。页面在列表排序时重新加载,然后列表中的至少一些元素在访问其属性时引发 Selenium
StaleElementReferenceExceptions。