debugging 调试列表解析的提示?

0ejtzxu1  于 2022-11-24  发布在  其他
关注(0)|答案(8)|浏览(177)

Python列表解析很好,但是几乎不可能调试。你们有什么好的技巧/工具来调试它们吗?

cgyqldqp

cgyqldqp1#

我使用了一个函数,它同时打印和返回一个值:

from pprint import pprint

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

这对于调试list/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))
    ]
j5fpnvbx

j5fpnvbx2#

这取决于列表的理解。你可以把代码的一部分移到另一个函数中。这应该是一个更容易调试的干净的解决方案。
示例:

[1.0 / i for i in [0, 2, 5, 10]]

可分为

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

和函数

def f(i):         
    return 1.0 / i

当您进行调试时,您会发现由于i = 0的值在f处出现“被零除”错误,因此会崩溃。

wgmfuz8q

wgmfuz8q3#

如果它太复杂了,乍一看并不明显,那么就把它分解成多个步骤和/或for循环。它显然太复杂了,使它更明确是调试它的最简单的方法。额外的好处:您现在可以使用调试器单步调试或添加print语句!

3bygqnnd

3bygqnnd4#

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

oknwwptz5#

提示:对于简单的任务(1或2级)使用列表解析。2否则,使其显式化对可读性更好。

1cklez4t

1cklez4t6#

使用像pdb这样的调试器来遍历列表解析,或者将列表解析分解为一个完整的for循环。

ippsafx7

ippsafx77#

Haskell列表解析至少可以用map、concat和filter重写(编译器就是这么做的)。
这个 haskell 的例子:

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

计算结果为:

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

我希望类似的身份将继续适用于Python,所以类似的分解也会产生Python中的等价代码,等价代码应该更容易调试(并且运行效率也差不多)。

u2nhd7ah

u2nhd7ah8#

基于Elmex80s构建的https://stackoverflow.com/a/39350403/5339264响应非常好,使用调试函数也可以帮助处理TypeError: unsupported operand type(s) for +: 'method' and 'str'或列表理解中的类似错误。
经典

def debug(i):
    print(f"i: {i}, {str(type(i))}")

在列表解析中,例如

[debug(item) for item in list]

可以非常有用地查明列表中的哪个项目导致了错误。

相关问题