Советы по анализу списков рассылки?

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

Ответ 1

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

Ответ 2

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

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

Это очень удобно для отладки любой части понимания списка /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))
    ]

Ответ 3

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

Пример:

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Понимание списка Haskell по крайней мере может быть (и это то, что делают компиляторы), переписанное с точки зрения карты, concat и фильтра.

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

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

Выполняется как:

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

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