可以在不导入的情况下使用Python标准库的Python写模块吗?

时间:2018-12-22 10:56:47

标签: python

我在使用Python模块时遇到了一些困难。我知道用C编写的内置模块就像Python解释器的一部分,因此程序员可以轻松使用它们,因为它们属于内置名称空间,因此不需要导入。那是否仅限于这些模块,这意味着所有其他非内置的,用Python编写的标准库模块都需要导入才能使用?

谢谢。

1 个答案:

答案 0 :(得分:5)

TLDR:除了builtins之外,您必须先导入每个模块。


就Python而言,有两种不同的“内置”:

  1. 已编译的内置对象,例如intos.chmod
  2. builtins模块包含一组基本对象,例如inthelp

事物可以是1的一部分,而不能是2的一部分,反之亦然。例如,help是纯Python函数,而os.chmodos模块的一部分。但是,出于实际原因,2中的大多数内容也是1的一部分:builtins经常使用,并且编译后的对象通常具有更好的性能。


建筑对象可以代表任何种类的模块,功能或对象。语言规范并未真正定义内置对象和内置对象。具体细节因实现而异:例如,CPython使用编译的C结构和函数,而PyPy使用编译的RPython对象。

根据经验,“ Python代码未定义的所有内容”都是内置的。但是,严格并非如此:内置对象可以访问解释器以创建常规Python对象。 所有内建函数的共同点是它们看起来像常规的Python对象,但是其内部结构可以遵循任意规则。

请注意,内建器不一定内置在解释器中。 CPython提供了C API,PyPy通过cpyext对其进行了仿真,从而允许shared libraries由解释器加载和使用。 许多第三方库使用已编译的Cython对象和函数来提供自定义内置函数。但是,可以使用任何可以产生与C API兼容的共享库的语言。


builtins module是名为 builtins的实际模块。 该模块的所有名称在所有其他模块中始终可用: 只要在当前作用域,其包含的作用域或当前模块中找不到名称,就会搜索builtins

这与每个模块中都有一个from builtins import *类似,但 却不同:如果更改builtins,内置名称将反映出这一点。

>>> int(5)
5
>>> import builtins
>>> builtins.int = float
>>> int(5)
5.0

例如,交互式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'])

其中一些是口译员高级部分的一部分,例如sysimportlibsitecustomize and usercustomize modules允许您准备环境-例如,更改交互式解释器的外观,在os.environment中设置搜索路径等。