2010-03-29 4 views

Répondre

3

Si c'est assez compliqué que ce n'est pas évident à première vue, décompressez-le en plusieurs étapes et/ou pour les boucles. C'est clairement trop compliqué, et le rendre plus explicite est le moyen le plus simple de le déboguer. Bonus ajouté: vous pouvez maintenant passer au débogueur ou ajouter des instructions d'impression!

+1

+1: utilisation pythonique des compréhensions de liste sont lorsque le code devient réellement plus clair et plus facile à lire – nosklo

+2

Ce genre de se sent comme abandon – Carbon

+0

Parfois, la reddition est le bon plan d'action! Si vous ne pouvez pas le lire, c'est clairement trop compliqué pour un one-liner. –

2

Conseil: Utilisez la compréhension de liste pour des tâches simples (1 ou 2 niveaux). Sinon, le rendre explicite est meilleur pour la lisibilité.

0

Dans Haskell j'utiliser quelque chose de similaire à:

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

Utilisez un débogueur comme pdb de marcher à travers ou briser la compréhension de la liste dans une boucle complète.

1

Les compréhensions de listes Haskell peuvent au moins être (et c'est ce que font les compilateurs) réécrites en termes de carte, de concat et de filtre.

Ainsi, cet exemple Haskell:

[ x*x | x<-[1..25], even x] 

Works comme:

map (\x-> x*x) (filter (even) [1..25]) 

je me attends à des identités similaires continueraient à tenir pour Python, la décomposition similaire devrait donner un code équivalent en Python ainsi. Le code équivalent devrait s'avérer plus facile à déboguer (et fonctionner aussi efficacement).

1

Cela dépend de la compréhension de la liste. Vous pouvez déplacer une partie du code vers une autre fonction. Cela devrait être une solution propre, plus facile à déboguer.

Exemple:

[sum([1.0/j for j in range(i, 100)]) for i in [0, 2, 5, 10]] 

Peut-être Devided dans

[f(i) for i in [0, 2, 5, 10]] 

et une fonction

def f(i):   
    return sum([1.0/j for j in range(i, 100)]) 
2

J'utilise une fonction qui ne fait qu'afficher et retourne une valeur en même temps:

def debug(msg, item): 
    print('\n' + msg + ':') 
    pprint(item) 
    return item 

Il est très pratique pour le débogage d'une partie d'une liste/compréhension 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

J'aime cette réponse! Dommage de le voir en bas, c'est l'équivalent naturel de l'impression-débogage en programmation fonctionnelle. –