如何确定一个模块是在另一个模块之前还是之后加载的

How to determine if one module has been loaded before or after another

这个用例是我正在编写的一个库使用 Python 模块来存储数据,这些数据必然与代码交织在一起;每个 "database entry" 都是在更高模块中定义的 class 的子 class。还有一个模块包含用于搜索此 "database" 的函数,它使用内省来根据用户提供的过滤器查找条目,并且只检查已经导入的模块。它通常配置为 return 它看到的第一个结果。

该库还需要与用户提供的数据库模块进行交互。用户模块可能想要 "override" 来自另一个模块的条目,我希望检查模块的顺序定义明确。理想情况下,我希望检查从最近导入到最近导入的条目。

如何按导入顺序对 sys.modules 的内容进行排序?

取决于导入模块的顺序并不常见,这暗示这不是正确的方法。相反,该库应根据需要包含允许用户覆盖某些条目的功能。

这也符合 Python 对软件开发的看法:显式优于隐式,用户希望覆盖的所有内容都应明确说明并与图书馆沟通。这可能看起来很麻烦,但它需要最少的魔法,并且最好在长 运行.

中维护

您可以将 rpattiso 的想法实现为

data_modules = []
def reg_import(modname):
    mod __import__(modname)
    data_modules.append(mod)
    return mod

然后以相反的顺序搜索data_modules。这需要用户导入和使用 reg_imports,但它会为您提供一个干净的数据模块列表以供搜索。一个可能的替代方案是在用户导入之前类似于以下内容。

from collections import OrderedDict
import sys

od = OrderedDict()
od.update(sys.modules)
sys.modules = od

从用户的角度来看,这将是自动的,但会将数据模块与其他模块混合在一起,并且需要更多处理才能将它们分开。我会选择注册功能。