#python #exception-handling #iterator #group-by
#python #исключение #итератор #группировка по
Вопрос:
Я использую iterator.groupby для группировки похожих записей в итераторе вместе на основе значения атрибута, подобного этому:
employment = dict(itertools.groupby(xtable_iterator), operator.attrgetter('key_to_ytable')))
key_to_ytable — это атрибут, который может вызывать исключение. Итак, весь мой конструктор dict завершается с ошибкой. Я хотел бы просто пропустить записи, для которых доступ к атрибуту ‘key_to_ytable’ вызывает исключение, и обработать оставшиеся записи с помощью groupby.
Какие у меня есть альтернативы?
1. Наследовать от groupby и переопределять функции ИЛИ написать свой собственный groupby
2. Используйте пользовательский attrgetter, который возвращает None при exception, а затем отфильтровывает None
3. Есть другое решение?
Немного предыстории: у меня есть библиотека, которая инкапсулирует таблицу базы данных как итератор объекта record. Атрибутами этого объекта record являются столбцы. В случае внешнего ключа библиотека просматривает соответствующую таблицу и извлекает значение в качестве значения атрибута. К сожалению, синхронизация таблиц не гарантируется. Итак, внешний ключ может ссылаться на несуществующую запись, и в этом случае библиотека выдает исключение.
Ответ №1:
Я голосую за пользовательский attrgetter в этой ситуации, например:
employment = dict(itertools.groupby(xtable_iterator),
lambda x: getattr(x, 'key_to_ytable', None))
employment.pop(None)
Это проще и, вероятно, быстрее, чем выполнение фильтра или чего-либо еще, вы знаете, что там будет только один None.
Комментарии:
1. Мне просто пришлось изменить пользовательский attrgetter в вашем решении, потому что, к сожалению, исключение, создаваемое библиотекой, которую я использую, не является AttributeError, и getattr это не обрабатывает. Миллион благодарностей за отличное решение. 🙂