Советы по отладке понимания списка? - PullRequest
11 голосов
/ 29 марта 2010

Понимание списка Python приятно, но почти невозможно отладить. У вас есть хорошие советы / инструменты для их отладки?

Ответы [ 7 ]

5 голосов
/ 04 июля 2017

Я использую функцию, которая просто печатает и возвращает значение одновременно:

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

Это очень удобно для отладки любой части понимания списка / слова:

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))
    ]
4 голосов
/ 29 марта 2010

Если это достаточно сложно, что на первый взгляд не очевидно, распакуйте его в несколько шагов и / или для циклов. Это явно слишком сложно, и сделать его более явным - это самый простой способ отладки. Дополнительный бонус: теперь вы можете переходить отладчиком или добавлять операторы печати!

2 голосов
/ 06 сентября 2016

Зависит от понимания списка. Вы можете переместить часть кода в другую функцию. Это должно быть чистое решение, которое легче отлаживать.

Пример:

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

Можно разделить на

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

и функция

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

Когда вы выполните отладку, вы обнаружите, что она вылетит из-за ошибки «отклонение от нуля» при f для значения i = 0.

2 голосов
/ 29 марта 2010

совет: используйте понимание списка для простых задач (1 или 2 уровня). В противном случае, сделать его явным лучше для удобства чтения.

1 голос
/ 29 марта 2010

По крайней мере, понимание списка Хаскелла можно (и это делают компиляторы) переписать в терминах map, concat и filter.

Итак, этот пример на Haskell:

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

Работает как:

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

Я ожидаю, что подобные идентификаторы будут продолжать сохраняться для Python, поэтому аналогичная декомпозиция должна также привести к эквивалентному коду в Python. Эквивалентный код должен легче отлаживаться (и работать так же эффективно).

0 голосов
/ 29 марта 2010

Используйте отладчик типа pdb, чтобы пройти или разбить понимание списка на полный цикл for.

0 голосов
/ 29 марта 2010

В Haskell I используется что-то похожее на:

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