当前位置: 首页 > 面试题库 >

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

乌翔
2023-03-14
问题内容

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

谢谢。


问题答案:

TLDR:使用前,您必须导入每个模块,除外builtins

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

  1. 编译的内置对象,例如intos.chmod
  2. builtins包含基本对象集(例如int和)的模块help

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

内置对象可以代表任何类型的模块,功能或对象。语言规范并未真正定义内置对象和内置对象。具体细节因实现而异:例如,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

例如,_在交互式Python会话中,是的一部分builtins。只要运行命令,它就会更改。

免责声明: 这仅用于演示。修改builtins自己是一个非常非常糟糕的主意。

虽然只有frombuiltins的名称可用而无需导入,但是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'])

其中一些是解释器的高级部分的一部分,例如sysimportlib。在sitecustomizeusercustomize模块允许准备环境-
例如,改变交互式解释看,在设置搜索路径os.environment,以及类似的。



 类似资料:
  • 问题内容: 我已经看到了几种通过首先导入来查找模块路径的方法。有没有一种方法,而无需导入模块? 问题答案: 使用pkgutil模块: 使用imp模块: 注意:使用imp模块,您 无法 做类似的事情

  • 本文向大家介绍Python标准库笔记struct模块的使用,包括了Python标准库笔记struct模块的使用的使用技巧和注意事项,需要的朋友参考一下 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结。 了解c语言的人,一定会知道struct结构体在c语言中的作

  • 这个模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Windows下运行。一个例子就是使用os.sep可以取代操作系统特定的路径分割符。 下面列出了一些在os模块中比较有用的部分。它们中的大多数都简单明了。 os.name字符串指示你正在使用的平台。比如对于Windows,它是'

  • sys模块包含系统对应的功能。我们已经学习了sys.argv列表,它包含命令行参数。 命令行参数 例14.1 使用sys.argv #!/usr/bin/python # Filename: cat.py importsys defreadfile(filename):     '''Print a file to the standard output.'''     f =file(filen

  • 问题内容: 在Python中,我有一个 模块 myModule.py,其中定义了一些函数和一个 main() ,它接受了一些命令行参数。 我通常从bash脚本中调用此main()。现在,我想将所有内容放入一个小 包装中 ,因此我想也许可以将我简单的bash脚本转换为Python脚本并将其放入包装中。 因此,实际上如何 从 MyFormerBashScript.py 的main()函数 调用 myM