在Python 3中,有些模块(文件)会遮盖标准模块,而有些则不会?

时间:2019-05-10 10:14:04

标签: python python-import

像这样的问题都有SO的历史;请参阅thisthis。答案大多指向相同的观点:“只使用绝对导入(Python 3中的默认设置),就可以得到标准模块,没问题”。好吧,我不同意。

我的用例是拥有一个typing模块,该模块将从标准typing模块(如果有)中导入所有内容,否则仅在该模块的命名空间中创建伪对象。这样,我可以编写带有类型提示的代码,该代码也适用于较旧的版本(例如3.4)。唯一的问题:importlib.import_module(在我的typing.py内部)看不到标准库模块,因此无法从中导入类型类。因此,“绝对导入”在这种情况下不起作用。

但显然,在两个链接中提出的解决方案适用于以下问题中的模块:timeio。实际上,如果我创建一个time.py(或io.py),然后从该目录创建import time,则将导入标准库模块,这没有问题。另一方面,如果我创建一个typing.py(或re.py),则将导入本地模块。

环顾sys,我发现timeio都在sys.builtin_module_names中,而retyping不在。因此,似乎import在“内置”(如编译为解释器)模块中的工作方式有所不同,在该模块中,绝对导入起作用,其余部分起作用。

我的问题是:

  1. 此行为记录在某处吗?
  2. 如何从我自己的手中“到达”标准typing模块?请注意,可以通过从''中删除sys.path来将其导入解释器或同一目录中的另一个文件中。但是在typing.py内部,这也不起作用。

0 个答案:

没有答案