python: мягкая версия iterator.groupby, которая пропускает записи при исключении

#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 это не обрабатывает. Миллион благодарностей за отличное решение. 🙂