Las comprensiones de la lista de Python son agradables, pero casi imposibles de depurar. Ustedes tienen algunos buenos consejos/herramientas para depurarlos?¿Consejos para depurar las listas de comprensión?
Respuesta
Si es lo suficientemente complicado como para que no sea obvio a primera vista, descomprímalo en varios pasos y/o bucles. Es claramente muy complicado, y hacerlo más explícito es la manera más fácil de solucionarlo. Bono adicional: ahora puede avanzar con el depurador o agregar instrucciones de impresión.
consejo: Use la lista de comprensión para tareas simples (1 o 2 niveles). De lo contrario, hacerlo explícito es mejor para la legibilidad.
En Haskell I usando algo similar a:
def trcPV(prompt, value):
print ("%s%s" % (prompt, str(value)))
return value
xs = trcPV("xs=", [x for x in range(0,100) if trcPV("check=",(trcPV("x=",x) % 15) in [0,3,5])])
uso de un depurador como pdb
a caminar a través de la lista o romper en una comprensión completa de bucle.
Haskell listas de comprensiones al menos pueden ser (y eso es lo que hacen los compiladores) reescrito en términos de mapa, concat y filtro.
Así que este ejemplo Haskell:
[ x*x | x<-[1..25], even x]
funciona como:
map (\x-> x*x) (filter (even) [1..25])
espero identidades similares podrían continuar manteniendo para Python, por lo que la descomposición similar debería producir código equivalente en Python también. El código equivalente debería ser más fácil de depurar (y ejecutarse con la misma eficiencia).
Depende de la lista de comprensión. Puede mover una parte del código a otra función. Esta debería ser una solución limpia que es más fácil de depurar.
Ejemplo:
[sum([1.0/j for j in range(i, 100)]) for i in [0, 2, 5, 10]]
se puede dividir en
[f(i) for i in [0, 2, 5, 10]]
y una función
def f(i):
return sum([1.0/j for j in range(i, 100)])
utilizo una función que sólo impresiones y devuelve un valor al mismo tiempo:
def debug(msg, item):
print('\n' + msg + ':')
pprint(item)
return item
Es muy útil para depurar cualquier parte de una lista por comprensión/dict:
new_lines = [
debug('CUR UPDATED LINE', change(line))
for line
in debug('ALL LINES', get_lines_from_file(filename))
if debug('CUR LINE EMPTY?', not_empty(line))
]
¡Me encanta esta respuesta! La vergüenza de ver al fondo, que es el equivalente natural de impresión depuración en la programación funcional. –
- 1. Consejos prácticos para depurar la recurrencia profunda?
- 2. ¿Consejos o herramientas para depurar aplicaciones Spring?
- 3. Comprensión de lista: hacer listas de listas
- 4. Scala Listas por comprensión
- 5. ¿Cómo se sangran las listas de comprensión de Python?
- 6. Python: StopIteration de excepción y las listas por comprensión
- 7. ¿Consejos para depurar errores de concurrencia difíciles de reproducir?
- 8. uso apropiado de listas de comprensión - python
- 9. Cómo leer/descodificar nombres de funciones temporales de comprensión de listas en Erlang al depurar
- 10. Comprensión de listas y dict combinados
- 11. Cierres y listas de comprensión en Haskell
- 12. Python, trabajar con listas por comprensión
- 13. Comprensión de las rutinas
- 14. Comprensión de las interfaces
- 15. Python: sintaxis avanzada de comprensión de listas anidadas
- 16. Problema de generalización de Haskell (que involucra listas de comprensión)
- 17. defaultdict equivalente para las listas
- 18. Erlang: ¿cómo implementar la comprensión de listas de Erlang?
- 19. Agregar a un dict de listas con una comprensión dict
- 20. ¿Las listas de comprensión de Python se reducen de manera eficiente?
- 21. Comprensión de listas frente a las funciones de orden superior en F #
- 22. ¿Hay alguna estructura de datos intermedia creada en las listas de comprensión
- 23. Consejos para encontrar y depurar memoria abandonada y crecimiento de almacenamiento
- 24. Continuación de línea para comprensión de listas o expresiones de generador en python
- 25. Threadsafe para todas las listas de
- 26. Comprensión de las enumeraciones scala
- 27. Atajo de teclado para consejos
- 28. ¿Cómo calcular las cointegraciones de dos listas?
- 29. Usar la comprensión de listas en Python para hacer algo similar a zip()?
- 30. Consejos para desarrollar Penlets
+1: el uso Pythonic de listas por comprensión son cuando el código de hecho, mientras más clara y fácil de leer – nosklo
Ese tipo de se siente como la rendición – Carbon
A veces rendirse es el curso de acción correcto. Si no puede leerlo, es claramente demasiado complicado para una sola línea. –