【发布时间】:2021-08-31 22:42:23
【问题描述】:
我将继续为 Ned Batchelder 的 byterun 编写代码,这是一个用 Python 编写的 Python 解释器,适用于 Python 3.4 以外的 Python 版本。见x-python。
这种方法的一个长期关注点是将导入中的解释器命名空间与解释程序命名空间分开。
另外:如果您想要快速解释器而不解释为导入的模块,则不分离命名空间可能是有利的,但是在解释来自不同 Python 版本的字节码时,分离模块更正确,虽然速度较慢,并且是必要的。
因此,当解释器遇到IMPORT_NAME 操作码时,我想使用importlib.util 基本上拥有与解释器遇到的任何导入不同的模块的副本。 p>
我现在遇到的问题是这些导入方式不同,这可以使用hasattr() 看到。
这是一个例子:
import importlib
module_spec = importlib.util.find_spec("textwrap")
textwrap_module = importlib.util.module_from_spec(module_spec)
submodule = "fill"
print(hasattr(textwrap_module, submodule)) # False
import textwrap
print(hasattr(textwrap, submodule)) # True
如何使用 importlib.util 获得相同的行为?
(但我应该注意,对于sys,两者都可以找到“路径”子模块作为sys 的属性。)
【问题讨论】:
-
您提到的代码的预期结果是什么?
-
@Sabil 我不确定你到底想要什么。如果运行程序,输出的第一行是 False,第二行是 True。我们想要发生的是当使用 importlib.util 时,子模块“fill”被列为导入的 textwrap 模块(和导入)的属性,就像使用 import 时所做的一样。
-
我只是为你添加一个解释。希望能帮助到你。 :)
标签: python-3.x python-import python-importlib