лямбда против оператора.attrgetter ('xxx') как функция ключа сортировки в Python
Я смотрю на некоторый код, который имеет много вызовов сортировки с использованием функций сравнения, и кажется, что он должен использовать ключевые функции.
Если бы вы изменили seq.sort(lambda x,y: cmp(x.xxx, y.xxx))
, что предпочтительнее:
seq.sort(key=operator.attrgetter('xxx'))
Или:
seq.sort(key=lambda a:a.xxx)
Я также хотел бы получить комментарии по существу внесения изменений в существующий код, который работает.
1 ответ:
" внесение изменений в существующий код, который работает " - это то, как развиваются программы;-). Напишите хорошую батарею тестов, которые дают известные результаты с существующим кодом, сохраните эти результаты (которые обычно известны как "золотые файлы" в контексте тестирования); затем внесите изменения, повторно запустите тесты и убедитесь (в идеале автоматизированным способом), что единственные изменения в результатах тестов-это те, которые специально предназначены, чтобы быть там-никаких нежелательных или неожиданных побочных эффектов. Можно использовать и больше сложные стратегии обеспечения качества, конечно, но это суть многих подходов "интеграционного тестирования".
Что касается двух способов написания простой функции
key=
, цель проекта состояла в том, чтобы сделатьoperator.attrgetter
быстрее, будучи более специализированным, но, по крайней мере, в текущих версиях Python нет измеримой разницы в скорости. В таком случае, для этой особой ситуации я бы рекомендовалlambda
, просто потому, что он более лаконичен и обобщен (и я обычно не любитель лямбды, имейте в виду!- ).