为什么模块数学称为“内置”?

时间:2014-04-07 06:10:30

标签: python

AFAIK,Python builtins引用__builtins__中包含的那些例外和函数:

>>> import builtins  # import __builtin__ in Python 2
>>> dir(builtins)  # dir(__builtin__) for Python 2
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
...many more...
'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed',
'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum',
'super', 'tuple', 'type', 'vars', 'zip']

但请看下面的代码(Python2和3都给出了相同的结果):

>>> globals()
{'__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>,
 '__loader__': <class '_frozen_importlib.BuiltinImporter'>,
 '__doc__': None, '__package__': None}
>>> import threading
>>> import math
>>> globals()
{'__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>,
 '__loader__': <class '_frozen_importlib.BuiltinImporter'>, 
 '__doc__': None, '__package__': None,
 'threading': <module 'threading' from C:\\ProgramFiles\\Python3.3\\lib\\threading.py'>,
 'math': <module 'math' (built-in)>}

在最后一行,模块math被称为built-in。为什么?模块maththreading等其他模块之间的区别是什么?

3 个答案:

答案 0 :(得分:4)

来自文档(./Doc/library/stdtypes.rst):

  

模块

     

...

     

解释器中内置的模块如下所示:<module 'sys' (built-in)>。如果从文件加载,则将其写为<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>

相关代码位于模块对象的repr()函数中:

static PyObject *
module_repr(PyModuleObject *m)
{
    char *name;
    char *filename;

    name = PyModule_GetName((PyObject *)m);
    if (name == NULL) {
        PyErr_Clear();
        name = "?";
    }
    filename = PyModule_GetFilename((PyObject *)m);
    if (filename == NULL) {
        PyErr_Clear();
        return PyString_FromFormat("<module '%s' (built-in)>", name);
    }
    return PyString_FromFormat("<module '%s' from '%s'>", name, filename);
}

答案 1 :(得分:2)

在您的情况下,math模块在​​构建库时包含在主Python库本身(libpython2.7.{so,dll,dylib})中。这是可能的,因为模块是用C而不是纯Python编写的。其他类似的模块包括sysposix

答案 2 :(得分:1)

Python docs有这样说:

  

然而,大部分库包含一组模块。有很多方法可以剖析这个系列。有些模块是用C语言编写的,内置于​​Python解释器中;其他的都是用Python编写的,并以源代码形式导入。

math模块位于C中,内置于解释器中,而threading位于Python中,并在源代码中导入。