调试列表推导的提示?

时间:2010-03-29 03:38:38

标签: python debugging list list-comprehension

Python列表推导很好,但几乎不可能调试。你们有任何好的技巧/工具来调试它们吗?

7 个答案:

答案 0 :(得分:5)

我使用的函数只是打印并同时返回一个值:

def backward(fcn_net, im, name_list_, target_blob):
    start=name_list_[len(name_list_)-1]; end=name_list_[0]
    print(start, end)
    fcn_net.blobs[start].diff[...]=im[...]
    fcn_net.backward(start=start, end=end)
    return fcn_net.blobs[target_blob].diff

调试列表/词典理解的任何部分非常方便:

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

答案 1 :(得分:4)

如果它足够复杂,乍一看并不明显,请将其拆分为多个步骤和/或循环。它显然太复杂了,并且使它更明确是调试它的最简单方法。额外的好处:您现在可以使用调试器或添加打印语句!

答案 2 :(得分:2)

提示:将列表理解用于简单任务(1或2级)。否则,明确表示更易于阅读。

答案 3 :(得分:2)

这取决于列表理解。您可以将部分代码移动到另一个函数。这应该是一个更容易调试的干净解决方案。

示例:

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

当您进行调试时,您会发现它会因fi = 0的“零除零”错误而崩溃。

答案 4 :(得分:1)

Haskell列表理解至少可以(并且这就是编译器所做的)用map,concat和filter重写。

所以这个Haskell例子:

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

计算如下:

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

我希望类似的身份将继续适用于Python,因此类似的分解也应该在Python中产生相同的代码。等效代码应该更容易调试(并且运行效率很高)。

答案 5 :(得分:0)

在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 :(得分:0)

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