with s (Col1, Col2) as (
select 'A', 1 from dual union all
select 'A', 2 from dual union all
select 'A', 3 from dual union all
select 'B', 1 from dual union all
select 'B', 2 from dual union all
select 'B', 3 from dual)
select col1, ltrim(sys_connect_by_path(col2, ','), ',') path
from s
start with col2 = 1
connect by prior col2 = col2 - 1 and prior col1 = col1;
C PATH
- ----------
A 1
A 1,2
A 1,2,3
B 1
B 1,2
B 1,2,3
6 rows selected.
Как указано предыдущими комментаторами, attrgetter
немного быстрее, но для большого количества ситуаций различие является крайним (~microseconds).
Относительно удобочитаемости, я лично предпочитаю lambda
, поскольку это - конструкция, которую люди будут видеть прежде в различных контекстах, таким образом, для других, вероятно, будет легче читать и понять.
Еще один протест состоит в том, что Ваш IDE должен быть в состоянии сигнализировать об опечатке на имени attr при использовании lambda
, в отличие от использования attrgetter
.
В целом я склонен выбирать конструкцию, которая не требует дополнительного импорта, если альтернативу достаточно легко записать и читать.
«Внесение изменений в существующий код, который работает» - вот как развиваются программы ;-). Напишите хороший набор тестов, которые дают известные результаты с существующим кодом, сохраните эти результаты (которые обычно называются «золотыми файлами» в контексте тестирования); затем внесите изменения, повторно запустите тесты и убедитесь (в идеале автоматизированным способом), что единственными изменениями в результатах тестов являются те, которые специально предназначены для их внесения - никаких нежелательных или неожиданных побочных эффектов . Конечно, можно использовать более сложные стратегии обеспечения качества, но в этом суть многих подходов к «интеграционному тестированию».
Что касается двух способов написания простой функции key =
, то замысел проекта состоял в том, чтобы сделать operator.attrgetter
быстрее за счет большей специализированности, но, по крайней мере, в текущих версиях Python. нет ощутимой разницы в скорости. В таком случае для этой особой ситуации я бы порекомендовал лямбда
просто потому, что он более краткий и общий (а я обычно не любитель лямбда, заметьте! -).