像这样的问题都有SO的历史;请参阅this或this。答案大多指向相同的观点:“只使用绝对导入(Python 3中的默认设置),就可以得到标准模块,没问题”。好吧,我不同意。
我的用例是拥有一个typing
模块,该模块将从标准typing
模块(如果有)中导入所有内容,否则仅在该模块的命名空间中创建伪对象。这样,我可以编写带有类型提示的代码,该代码也适用于较旧的版本(例如3.4)。唯一的问题:importlib.import_module
(在我的typing.py
内部)看不到标准库模块,因此无法从中导入类型类。因此,“绝对导入”在这种情况下不起作用。
但显然,在两个链接中提出的解决方案适用于以下问题中的模块:time
和io
。实际上,如果我创建一个time.py
(或io.py
),然后从该目录创建import time
,则将导入标准库模块,这没有问题。另一方面,如果我创建一个typing.py
(或re.py
),则将导入本地模块。
环顾sys
,我发现time
和io
都在sys.builtin_module_names
中,而re
或typing
不在。因此,似乎import
在“内置”(如编译为解释器)模块中的工作方式有所不同,在该模块中,绝对导入起作用,其余部分起作用。
我的问题是:
typing
模块?请注意,可以通过从''
中删除sys.path
来将其导入解释器或同一目录中的另一个文件中。但是在typing.py
内部,这也不起作用。