2015-01-26 3 views
0

numpy에서 사용자가 실수를하면 오류가 모든 numpy 내부 정보를 나타내지 않고 사용자 수준 오류 만 알려줍니다. 예를 들어 :Numpy 스타일의 오류 추적?

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

는 NumPy와는 호환되지 않는 행렬을 곱되는지 결정하기 위해했던 주위의 모든 내부 수신 거부에 대해 얘기하지 않는 방법

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) 

공지 사항,도 여기서 다시 뱉어 ValueError가 정확히 발생했습니다. 디버그 모드가 아니면 traceback이 모듈 내부에서 멈추어야하는 프로젝트에 대해서도 같은 작업을하고 싶습니다. 따라서 트레이스 백이 10 단계이고 첫 번째 4 개가 사용자 레벨에 있고 마지막 6 개가 내 라이브러리에서 내부 처리 인 경우 첫 번째 기능 만 원할 것입니다.

스택을 추출하는 방법을 알고 있습니다. ,하지만 그것을 수정하고 예외를 제기하기 전에 다시 삽입하는 방법을 모르겠습니다. 나는 또한 이것이 나쁜 생각으로 여겨지고 있다고 생각하고, 그렇다면 다른 옵션이 무엇인지 알고 싶습니다.

내 끔찍한 임시 방편은 다음과 같이보고한다 :

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

가장 쉬운 방법은 단순히 오류를 잡아 내고 오류를 발생시키는 것입니다. 사실 stacktrace를 수정하는 것은 불가능하지 않지만 권장하지는 않습니다. https://github.com/mitsuhiko/jinja2/blob/master/jinja2/debug.py – Wolph

+0

하지만 내 오류 만 발생합니다. 1 톤의 내부적 인 수신 거부 이후 나는 사용자가 그 어떤 것도 보지 못하게하고, BC는 정보로는 아무 것도 할 수 없으며, 공정한 비트가있다. 사용자가 라이브러리에 대한 입력 내용이 잘못되었음을 알리고 싶습니다. – RodericDay

+0

나는 당신의 문제를보고, 그 경우 traceback에 관한 불필요한 정보를 제거하기 위해'limit' 매개 변수를 사용할 것을 제안합니다. 그리고 이것이 옵션이 아닌 경우'print (traceback.format_list (your_filter_func (traceback.extract_stack()))')를 사용하여 stacktrace의 부분 버전을 인쇄하여 인쇄를 쉽게 할 수 있습니다. – Wolph

답변

1

A+B은 내부 스택 프레임을 표시하지 않는 유일한 이유는 numpy.ndarray.__add__()는 C로 구현 될 일이다, 그래서 파이썬 스택 프레임이없는 표시 할 A+B이 들어간 후. numpy는 스택 추적을 정리하는 데 특별한 조치를 취하지 않습니다.