Без вызова lower()
, следующий можно считать немного чище, чем при использовании лямбда:
import operator
catlist.sort(key=operator.attrgetter('name'))
Добавить этот призыв к lower()
, и вы входите в мир боли в функциональном составе. Использование Ants Aasma «s compose()
найдено в ответ на this other SO question, вы тоже можете увидеть свет, который является функциональным программированием (я шучу Все парадигмы программирования, безусловно, имеет свое место и время..):
>>> def compose(inner_func, *outer_funcs):
... if not outer_funcs:
... return inner_func
... outer_func = compose(*outer_funcs)
... return lambda *args, **kwargs: outer_func(inner_func(*args, **kwargs))
...
>>> class A(object):
... def __init__(self, name):
... self.name = name
...
>>> L = [A(i) for i in ['aa','a','AA','A']]
>>> name_lowered = compose(operator.attrgetter('name'),
operator.methodcaller('lower'))
>>> print [i.name for i in sorted(L, key=name_lowered)]
['a', 'A', 'aa', 'AA']
Это помогло бы, если вы читаете сообщения об ошибках, одно для ваших кодовых пунктов ** точно на точке ** в 'x.name' – Marian