Python列表推导很好,但几乎不可能调试。你们有任何好的技巧/工具来调试它们吗?
答案 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)])
当您进行调试时,您会发现它会因f
处i = 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循环。