2010-04-24 10 views
18

Estoy buscando un código que tiene muchas llamadas de clasificación usando funciones de comparación, y parece que debería estar usando funciones clave.lambda contra operator.attrgetter ('xxx') como función de clave de ordenación en Python

Si se va a cambiar seq.sort(lambda x,y: cmp(x.xxx, y.xxx)), que es preferible:

seq.sort(key=operator.attrgetter('xxx')) 

o:

seq.sort(key=lambda a:a.xxx) 

Me gustaría que le interesen también observaciones sobre el fondo de realizar cambios en el código existente que funciona.

Respuesta

17

"Hacer cambios en el código existente que funciona" es cómo evolucionan los programas ;-). Escriba una buena batería de pruebas que den resultados conocidos con el código existente, guarde esos resultados (que normalmente se conocen como "archivos dorados" en un contexto de prueba); a continuación, realice los cambios, vuelva a ejecutar las pruebas y verifique (idealmente de forma automática) que los únicos cambios en los resultados de las pruebas son los específicamente diseñados para , sin efectos secundarios no deseados o inesperados. Uno puede usar estrategias de aseguramiento de calidad más sofisticadas, por supuesto, pero esta es la esencia de muchos enfoques de "pruebas de integración".

En cuanto a las dos formas de escribir la función simple key=, la intención del diseño era hacer que operator.attrgetter fuera más especializado, pero al menos en las versiones actuales de Python no hay una diferencia apreciable en la velocidad. Siendo ese el caso, para esta situación especial recomendaría el lambda, simplemente porque es más conciso y general (¡y no soy un amante de lambda, por lo general!).

+7

estoy de acuerdo con la respuesta de alex (es que no es un amante de lambda) :-) pero también en segundo lugar la noción de lambda. en su ejemplo anterior, puede ser un poco más rápido porque no tiene que buscar ya sea 'operator' o' operator.attrgetter() '... ¡ya tiene el objeto de función real! sin embargo, apenas se nota como dijo Alex, pero la solución 'lambda' sí gana puntos Python Zen al ser más fácil de leer. – wescpy

+0

¡Gracias, Alex y Wesley! – PaulMcG

Cuestiones relacionadas