据我所知,python内置函数是从C源代码编译而来,内置于解释器中。有没有办法找出功能代码在反汇编器中查看的位置?
增加: 对于这样的函数id()返回一个地址,不是吗?但是当我在调试器中查看它时,它包含的东西远不是asm代码。
加法2: 我没有源代码,因为解释器是自定义构建的。
答案 0 :(得分:4)
所有内置函数都在__builtin__
模块中定义,由Python/bltinmodule.c
source file定义。
要查找特定的内置函数,请查看module initialisation function和module methods table,然后grep Python源代码以获取附加函数的定义。 __builtin__
中的大多数函数都在同一个文件中定义。
例如,在方法表中找到dir()
function:
{"dir", builtin_dir, METH_VARARGS, dir_doc},
和builtin_dir
定义为in the same file,委托给PyObject_Dir()
:
static PyObject *
builtin_dir(PyObject *self, PyObject *args)
{
PyObject *arg = NULL;
if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg))
return NULL;
return PyObject_Dir(arg);
}
快速浏览Python源代码导致Objects/object.c
,其中PyObject_Dir()
使用多个辅助函数实现:
/* Implementation of dir() -- if obj is NULL, returns the names in the current
(local) scope. Otherwise, performs introspection of the object: returns a
sorted list of attribute names (supposedly) accessible from the object
*/
PyObject *
PyObject_Dir(PyObject *obj)
{
PyObject * result;
if (obj == NULL)
/* no object -- introspect the locals */
result = _dir_locals();
else
/* object -- introspect the object */
result = _dir_object(obj);
assert(result == NULL || PyList_Check(result));
if (result != NULL && PyList_Sort(result) != 0) {
/* sorting the list failed */
Py_DECREF(result);
result = NULL;
}
return result;
}