Les compréhensions de liste Python sont agréables, mais presque impossible à déboguer. Vous avez de bons conseils/outils pour les déboguer?Conseils pour le débogage des listes de compréhension?
Répondre
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!
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é.
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])])
Utilisez un débogueur comme pdb
de marcher à travers ou briser la compréhension de la liste dans une boucle complète.
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).
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)])
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))
]
J'aime cette réponse! Dommage de le voir en bas, c'est l'équivalent naturel de l'impression-débogage en programmation fonctionnelle. –
+1: utilisation pythonique des compréhensions de liste sont lorsque le code devient réellement plus clair et plus facile à lire – nosklo
Ce genre de se sent comme abandon – Carbon
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. –