我在使用Python模块时遇到了一些困难.我知道用C语言编写的内置模块就像是Python解释器的一部分,因此它们可供程序员随时使用,因为它们属于内置命名空间,因此不需要导入.这仅限于那些模块,这意味着所有其他非内置的,Python编写的标准库模块需要导入才能使用吗?
谢谢.
TLDR:除了使用之外,您必须在使用前导入每个模块builtins.
就Python而言,有两种不同的"内置":
int或os.chmod.builtins模块包含一组基本对象,例如int和help.事物可以是1的一部分而不是2的一部分,反之亦然.例如,help是纯Python函数,并且os.chmod是os模块的一部分.但是,由于实际原因,2中的大部分内容也是1的一部分:builtins使用了很多,编译对象通常具有更好的性能.
内置对象可以表示任何类型的模块,功能或对象.语言规范并没有真正定义哪些对象是内置的以及内置的是什么.细节因实现而异:CPython使用已编译的C结构和函数,而PyPy使用已编译的RPython对象.
根据经验,"Python代码未定义的所有内容"都是内置的.但是,这并不严格:内置对象可以访问解释器来创建常规Python对象.所有内置函数都有共同之处,它们看起来像普通的Python对象,但它们的内部可以遵循任意规则.
请注意,内置函数不一定内置于解释器中.CPython提供了一个C API,PyPy通过cpyext模拟它,允许解释器加载和使用共享库.许多第三方库使用已编译的Cython对象和函数来提供自定义内置函数.但是,可以使用任何可以生成与C API兼容的共享库的语言.
该builtins模块是一个名为 的实际模块builtins.此模块的所有名称始终在所有其他模块中可用:
builtins只要在当前作用域,其包含的作用域或当前模块中找不到名称,就会搜索该名称.
这与每个模块中都有相似但不相同from builtins import *:如果builtins更改,内置名称反映了这一点.
>>> int(5)
5
>>> import builtins
>>> builtins.int = float
>>> int(5)
5.0
Run Code Online (Sandbox Code Playgroud)
例如,_交互式Python会话是其中的一部分builtins.每当运行命令时它都会更改.
免责声明:这只是为了演示.修改builtins自己是一个非常非常糟糕的主意.
虽然只有名称来自builtins而无需导入,但Python通常会在启动时导入几个模块.
$ python3 -c 'import sys;print(sys.modules.keys())'
dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'types', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'mpl_toolkits', 'sphinxcontrib', 'sitecustomize', 're', 'enum', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg'])
Run Code Online (Sandbox Code Playgroud)
其中一些是解释器的高级部分的一部分,例如sys和importlib.在sitecustomize与usercustomize模块允许准备环境-例如,改变交互式解释看,在设置搜索路径os.environment,以及类似的.