在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()
答案 0 :(得分:1)
A+B
没有显示任何内部堆栈帧的唯一原因是numpy.ndarray.__add__()
碰巧在C中实现,因此在包含{{1}之后没有Python堆栈帧1}}显示。 numpy没有做任何特别的事情来清理堆栈跟踪。