Numpy风格的错误追溯?

时间:2015-01-26 17:36:55

标签: python numpy traceback

在numpy中,当你犯了一个错误时,错误并没有告诉你所有的numpy内部,只是用户级错误。例如:

import numpy as np
A = np.ones([1,2])
B = np.ones([2,3])
A+B

回吐

Traceback (most recent call last):
  File "/home/roderic/Desktop/scratchpad.py", line 5, in <module>
    A+B
ValueError: operands could not be broadcast together with shapes (1,2) (2,3) 

注意它并没有告诉你关于numpy所做的所有内部反弹,以确定你是在增加不兼容的矩阵,也没有确切地引发ValueError。我想对我的项目做同样的事情,其中​​回溯应该停止在模块内部之外(除非我处于调试模式)。因此,如果回溯是10步长,前4个是用户级别,最后6个是我库中的内部处理,我只想要显示前4个。

我知道如何提取堆栈,但我不知道如何修改它并在引发异常之前重新注入它。我还认为这被认为是一个坏主意,如果是这样,我想知道我的其他选择是什么。

我可怕的临时解决方案看起来像这样:

    except AssertionError as error:
        # something went wrong, the input was not correct
        print( "Traceback (most recent call last):")
        for filepath, line_no, namespace, line in traceback.extract_stack():
            if os.path.basename(filepath)=='MyModuleName.py': break
            print(  '  File "{filepath}", line {line_no}, in {namespace}\n'
                    '    {line}'.format(**locals()))
        exit()

1 个答案:

答案 0 :(得分:1)

A+B没有显示任何内部堆栈帧的唯一原因是numpy.ndarray.__add__()碰巧在C中实现,因此在包含{{1}之后没有Python堆栈帧1}}显示。 numpy没有做任何特别的事情来清理堆栈跟踪。