如何确定一个模块是否已在另一个模块之前或之后加载

时间:2015-01-01 19:21:04

标签: python python-3.x

用例是我正在编写的库使用Python模块来存储必须与代码严重交错的数据;每个“数据库条目”是在更高模块中定义的类的子类。还有一个模块包含用于搜索此“数据库”的函数,该数据库使用内省来根据用户给出的过滤器查找条目,并且仅检查已导入的模块。它通常配置为返回它看到的第一个结果。

此库还希望与用户提供的数据库模块进行交互。用户模块可能想要“覆盖”来自另一个模块的条目,并且我想要检查模块的顺序是否被很好地定义。理想情况下,我希望从最近导入到最近最少导入的条目进行检查。

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

2 个答案:

答案 0 :(得分:0)

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

这也符合Python对软件开发的看法:显式优于隐式,用户希望覆盖的所有内容都应明确拼写出来并与库进行通信。这可能看起来很麻烦,但它需要的魔力最小,从长远来看,维护起来会更好。

答案 1 :(得分:0)

您可以将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

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