如何查看 Python 的 __builtins__ 源代码?

151 阅读1分钟

Python 中的 builtins 是一个内置模块,它包含了 Python 解释器中可用的所有内置函数和变量。但是,builtins 模块的源代码并不像其他模块那样容易找到。

2、解决方案

builtins 模块的源代码位于 Python 解释器的源代码中,具体位置是 Python/bltinmodule.c。这个文件包含了 builtins 模块的所有函数和变量的定义。

# Python/bltinmodule.c

PyMODINIT_FUNC PyInit__builtin__(void)
{
    PyObject *m;

    m = PyModule_Create(&BuiltinModule);
    if (m == NULL)
        return NULL;

    /* ... */

    return m;
}
// Python/bltinmodule.c
static PyMethodDef builtins_methods[] = {
    {"apply",        apply,        METH_VARARGS},
    {"chr",          PyUnicode_FromOrdinal, METH_O},
    {"cmp",          cmp,          METH_VARARGS},
    {"coerce",       coerce,       METH_VARARGS},
    {"compile",      compile,      METH_VARARGS | METH_KEYWORDS},
    {"delattr",      delattr,      METH_VARARGS},
    {"dir",          dir,          METH_VARARGS | METH_KEYWORDS},
    {"divmod",       divmod,       METH_VARARGS},
    {"eval",         eval_code,    METH_VARARGS | METH_KEYWORDS},
    {"exec",         exec_code,    METH_VARARGS | METH_KEYWORDS},
    {"getattr",      getattr,      METH_VARARGS},
    {"hasattr",      hasattr,      METH_VARARGS},
    {"hash",         PyUnicode_Hash, METH_O},
    {"hex",          hex,          METH_O},
    {"id",           id,           METH_O},
    {"input",        stdin_input,  METH_VARARGS | METH_KEYWORDS},
    {"isinstance",   isinstance,   METH_VARARGS},
    {"issubclass",   issubclass,   METH_VARARGS},
    {"len",          PyUnicode_GET_SIZE, METH_O},
    {"locals",       locals,       METH_NOARGS},
    {"max",          max,          METH_VARARGS | METH_KEYWORDS},
    {"min",          min,          METH_VARARGS | METH_KEYWORDS},
    {"next",         next,         METH_O},
    {"oct",          oct,          METH_O},
    {"open",         open_file,    METH_VARARGS | METH_KEYWORDS},
    {"ord",          PyUnicode_GetWchar, METH_O},
    {"pow",          pow,          METH_VARARGS | METH_KEYWORDS},
    {"print",        print_expr,   METH_VARARGS | METH_KEYWORDS},
    {"property",     property,     METH_VARARGS},
    {"quit",         Py_Exit,      METH_VARARGS},
    {"range",        range_function, METH_VARARGS | METH_KEYWORDS},
    {"reload",       reload_module, METH_VARARGS},
    {"repr",         repr,         METH_O},
    {"reversed",     reversed_iterator, METH_O},
    {"round",        round,        METH_VARARGS | METH_KEYWORDS},
    {"setattr",      setattr,      METH_VARARGS},
    {"sorted",       sorted_list,  METH_VARARGS | METH_KEYWORDS},
    {"sum",          sum,          METH_VARARGS | METH_KEYWORDS},
    {"super",        super_function, METH_VARARGS | METH_KEYWORDS},
    {"vars",         vars,         METH_O},
    {"zip",          zip,          METH_VARARGS},
    {NULL,           NULL}      /* sentinel */
};

您还可以使用以下命令来打印 builtins 模块的源代码:

import dis
dis.dis(__builtins__)

这种方法可以打印出 builtins 模块中所有函数和变量的汇编代码。