Учет списков в 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. Эквивалентный код должен быть проще отлаживать (и работать примерно так).