我的问题是:当我使用一个包并从中导入东西时,发生了什么?
from pypackage import pymodule
什么对象会被加载到内存中(Python解释器的对象堆中)?更一般地说:会发生什么?:)
我猜上面的例子做了这样的事情:
pypackage
包的某个对象在内存中被创建(其中包含有关包但不太多的信息),模块pymodule
被加载到内存中,并在本地名称空间中创建了它的引用。重要的是:除非明确声明(在模块本身中或在包初始化技巧和钩子的某个地方,我对此不熟悉),否则不会在内存中创建pypackage
的其他模块(或其他对象)。最后,在内存中唯一的大型内容是pymodule
(即导入模块时创建的所有对象)。是这样吗?如果有人能澄清这个问题,我会很感激。也许你能提供一些有用的文章?(文档涵盖了更具体的内容)
我在同一个问题的答案中找到了以下内容:
当Python导入一个模块时,首先检查模块注册表(sys.modules)是否已经导入该模块。如果是这样,Python将使用现有的模块对象。
否则,Python会执行以下操作:
- 创建一个新的空模块对象(这本质上是一个字典)
- 将该模块对象插入sys.modules字典中
- 加载模块代码对象(如果必要,首先编译模块)
- 在新模块的名称空间中执行模块代码对象。代码分配的所有变量都将通过模块对象可用。
并且会很感激对包进行相同类型的解释。
顺便说一句,在包中,模块名称被奇怪地添加到sys.modules
中:
>>> import sys
>>> from pypacket import pymodule
>>> "pymodule" in sys.modules.keys()
False
>>> "pypacket" in sys.modules.keys()
True
还有一个关于同样事情的实际问题。
当我构建一组工具时,这些工具可能用于不同的进程和程序,并将它们放在模块中。即使我只想使用其中一个声明的函数,我也别无选择,只能加载完整的模块。我认为可以通过制作小型模块并将它们放入软件包中(如果软件包在您导入其中一个模块时不会加载其所有模块),以减轻此问题的痛苦。
有没有更好的方法在Python中创建这样的库呢?(仅使用纯函数,没有模块内部的任何依赖项)。 这在C扩展中是否可能?
对于这样一个长问题,抱歉。