2010-03-29 18 views

Respuesta

3

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.

+1

+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

+2

Ese tipo de se siente como la rendición – Carbon

+0

A veces rendirse es el curso de acción correcto. Si no puede leerlo, es claramente demasiado complicado para una sola línea. –

2

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.

0

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])]) 
0

uso de un depurador como pdb a caminar a través de la lista o romper en una comprensión completa de bucle.

1

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).

1

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)]) 
2

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)) 
    ] 
+0

¡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. –

Cuestiones relacionadas