你在正確的軌道上。解析代碼樹時,它只會多次運行PyEval_FrameEx
。 最後,它會調用format_exc_check_arg()
來格式化錯誤,對於我來說,發生在Python版本3.3.2源文件的ceval.c
的第2100行。 format_exc_check_arg()
推導進攻「對象」(prnt
),並調用在PyErr_Format
errors.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 == NULL
和NameError
被設置和格式化。
希望這可以幫助你進一步。
爲什麼'c'標籤..? –
@Dayalrai rai,因爲我正在尋找C程序,它... – SebGR
出於好奇:爲什麼要知道? – Evert