如何提取python内置函数代码

时间:2014-11-30 13:36:16

标签: python built-in python-internals

据我所知,python内置函数是从C源代码编译而来,内置于解释器中。有没有办法找出功能代码在反汇编器中查看的位置?

增加: 对于这样的函数id()返回一个地址,不是吗?但是当我在调试器中查看它时,它包含的东西远不是asm代码。

加法2: 我没有源代码,因为解释器是自定义构建的。

1 个答案:

答案 0 :(得分:4)

所有内置函数都在__builtin__模块中定义,由Python/bltinmodule.c source file定义。

要查找特定的内置函数,请查看module initialisation functionmodule 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;
}