У меня есть список объектов, которые мне нужно отсортировать в соответствии с key function. Проблема в том, что некоторые элементы из моего списка могут «устаревать», а список сортируется. Когда ключевая функция вызывается на таком истекшем элементе, она выходит из строя с исключением.Python: Обработка исключений при сортировке
В идеале, что бы мне хотелось, это способ сортировки моего списка с помощью ключевой функции, так что при возникновении ошибки при вызове ключевой функции для элемента этот элемент исключается из результата сортировки.
Моя проблема может быть восстановлена с помощью следующего примера: Предположим, у меня есть два класса, 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»? – jazzpi
Мне любопытно, почему ваши объекты истекают. Это еще один поток, изменяющий ваши объекты во время сортировки? Или они буквально истекают из-за времени? Но тогда, почему это заставит атрибут вызывать исключение? Например, не разумно сделать атрибут 'Apple.age' поднять' TooOldException'. – Kevin
@Kevin, объекты истекают, потому что они представляют веб-элементы Selenium в открытом окне браузера (= другой процесс). Если, например,. страница перезагружается во время сортировки списка, то по крайней мере некоторые элементы списка вызывают Selenium 'StaleElementReferenceExceptions' при доступе к их атрибутам. –