IPython错误行和列

时间:2014-03-12 10:05:30

标签: python debugging numpy ipython

在IPython交互式控制台中是否有可能不仅显示错误发生的行而且还显示列?

例如在这个脚本中,我知道有问题的行是934,但我无法找到哪个语句生成错误,因为我不知道该列。

--> 934                 dQ0 = (Knm0[u, :] + W0[u, u] - Knm0[u, ma]) - multiply((Kn0[u]), (Km0 + Kn0[u] - Km0[ma])) / s0  
    935                 dQ1 = (Knm1[u, :] + W1[u, u] - Knm1[u, ma]) - multiply((Kn1[u]), (Km1 + Kn1[u] - Km1[ma])) / s1  
    936                 dQ = d0 * dQ0 - d1 * dQ1  

IndexError: invalid index to scalar variable.

2 个答案:

答案 0 :(得分:2)

假设我正确理解了您的问题,请更改:

dQ0 = (Knm0[u, :] + W0[u, u] - Knm0[u, ma]) - multiply((Kn0[u]), (Km0 + Kn0[u] - Km0[ma])) / s0  

dummy0 = (Knm0[u, :] + W0[u, u] - Knm0[u, ma])
dummy1 = multiply((Kn0[u]), (Km0 + Kn0[u] - Km0[ma])) / s0  
dQ0 = dummy0 - dummy1

依此类推,将大问题分成几块,直到你确切知道问题出在哪里

复杂的oneliner语句使代码更难以调试或在几个月/几年之后或者没有编写代码的其他人理解

答案 1 :(得分:1)

通常,调试这些的最短方法就是:

In [5]: %debug

(如果debug已启用,则只需%automagic)。这会使您进入发生故障的调试器。然后你可以转储不同的对象,即Knm0Kn0等,或尝试不同的部分,如Knm0[u,:],看看哪一个抛出错误,对象是什么样的,等等。 p>

在您的情况下,您似乎正在尝试对不是数组的内容使用切片,例如执行245[0]是不合法的。所以它不是问题哪一列那么简单 - 这条线根本就不是问题所在,它很可能在上面的一些线上生成了这条线使用的实际上有这个bug的变量