2013-07-04 57 views
0

考慮以下verysimple.pyPython從哪裏獲取其追溯信息?

if '__main__' == __name__: 
    prnt('Line1') 

現在,如果我有> python verysimple.py執行它,我當然歡迎通過:

Traceback (most recent call last): 
     File "verysimple.py", line 2, in <module> 
      prnt('Line1') 
    NameError: name 'prnt' is not defined` 

我想知道在的Python從(特別是錯誤的命令)拉回追蹤信息。

我已經試圖找到裏面PyEval_FrameEx我的方式,但不能弄明白......

+0

爲什麼'c'標籤..? –

+0

@Dayalrai rai,因爲我正在尋找C程序,它... – SebGR

+0

出於好奇:爲什麼要知道? – Evert

回答

1

你在正確的軌道上。解析代碼樹時,它只會多次運行PyEval_FrameEx。 最後,它會調用format_exc_check_arg()來格式化錯誤,對於我來說,發生在Python版本3.3.2源文件的ceval.c的第2100行。 format_exc_check_arg()推導進攻「對象」(prnt),並調用在PyErr_Formaterrors.c正確格式化異常字符串(異常類型和它的相應的字符串,NAME_ERROR_MSG,已經從該行2100

我只是用傳遞給format_exc_check_arg()這段代碼進行測試:

prnt('Line1') 

,然後通過的Python 3.3的debug build我不得不四處奔波它

周圍的代碼英寸PyEval_FrameEx

TARGET(LOAD_NAME) 
     w = GETITEM(names, oparg); 
     if ((v = f->f_locals) == NULL) { 
      PyErr_Format(PyExc_SystemError, 
         "no locals when loading %R", w); 
      why = WHY_EXCEPTION; 
      break; 
     } 
     if (PyDict_CheckExact(v)) { 
      x = PyDict_GetItem(v, w); 
      Py_XINCREF(x); 
     } 
     else { 
      x = PyObject_GetItem(v, w); 
      if (x == NULL && PyErr_Occurred()) { 
       if (!PyErr_ExceptionMatches(
           PyExc_KeyError)) 
        break; 
       PyErr_Clear(); 
      } 
     } 
     if (x == NULL) { 
      x = PyDict_GetItem(f->f_globals, w); 
      Py_XINCREF(x); 
      if (x == NULL) { 
       if (PyDict_CheckExact(f->f_builtins)) { 
        x = PyDict_GetItem(f->f_builtins, w); 
        if (x == NULL) { 
// below is the line where the PyExc_NameError will be properly formatted. 
         format_exc_check_arg(
            PyExc_NameError, 
            NAME_ERROR_MSG, w); 
         break; 
        } 
        Py_INCREF(x); 
       } 
       else { 
        x = PyObject_GetItem(f->f_builtins, w); 
        if (x == NULL) { 
         if (PyErr_ExceptionMatches(PyExc_KeyError)) 
          format_exc_check_arg(
             PyExc_NameError, 
             NAME_ERROR_MSG, w); 
         break; 
        } 
       } 
      } 
     } 
     PUSH(x); 
     DISPATCH(); 

注意,兩行它上面,PyDict_GetItem(...)將是線努力尋找prnt內建語句&功能(I推斷,從f->builtins,向其中w被施加,w本身從第二得到內上述代碼中的聲明。 由於該字典查找將失敗,x == NULLNameError被設置和格式化。

希望這可以幫助你進一步。