У меня есть функция, которая несколько раз сортирует на основе списка кортежей атрибутов и обращенных логических значений, например:
def multisort(lst, sorting):
for attr, reverse in reversed(sorting):
lst.sort(key=operator.attrgetter(attr), reverse=reverse)
return lst
Пример ввода в сортировку var будет выглядеть примерно так: [('attr_1', True), ('attr_2', False)]
.
Я обновляю код до Py3, и он больше не работает, потому что иногда значения атрибутов равны None (нельзя сравнивать NoneType с не-NoneTypes). Существует множество решений для стекопотока для этого типа проблем, которые рекомендуют заменять attrgetter для лямбда-функции, такой как lambda x: (getattr(x, attr) is None, getattr(x, attr))
.
К сожалению, это не работает для меня, потому что атрибуты, по которым я сортирую, могут иметь точки в них, например, 'attr_1.sub_attr_1'. operator.attrgetter поддерживает это, но, конечно, нативный getattr этого не делает.
Любые предложения о том, как можно написать обертку вокруг attrgetter для этого или написать собственную функцию ключа, которая будет работать здесь? Заранее спасибо.