Я смотрю на некоторый код, который имеет много вида, вызывает функции сравнения использования, и кажется, что он должен использовать ключевые функции.
Если необходимо было измениться seq.sort(lambda x,y: cmp(x.xxx, y.xxx))
, который предпочтителен:
seq.sort(key=operator.attrgetter('xxx'))
или:
seq.sort(key=lambda a:a.xxx)
Я также интересовался бы комментариями к достоинствам внести изменения в существующий код, который работает.
Как указано предыдущими комментаторами, attrgetter
немного быстрее, но для большого количества ситуаций различие является крайним (~microseconds).
Относительно удобочитаемости, я лично предпочитаю lambda
, поскольку это - конструкция, которую люди будут видеть прежде в различных контекстах, таким образом, для других, вероятно, будет легче читать и понять.
Еще один протест состоит в том, что Ваш IDE должен быть в состоянии сигнализировать об опечатке на имени attr при использовании lambda
, в отличие от использования attrgetter
.
В целом я склонен выбирать конструкцию, которая не требует дополнительного импорта, если альтернативу достаточно легко записать и читать.