我从一个可能存在或可能不存在的模块列表中得到import *
的情况。到目前为止,我已经找到了一个像这样的工作解决方案:
for module in modules:
try:
imported = __import__(module, globals(), locals(), [], -1)
for sub in module.split(".")[1:]:
imported = getattr(imported, sub)
for name in [n for n in dir(imported) if not n.startswith("_")]:
globals()[name] = getattr(imported, name)
except (ImportError, AttributeError):
pass
这是有效的,但是当它们正在寻找以这种方式导入的变量时,它们总是混乱并且难以理解。我确定__import__
在from foo import *
的工作方式中遗漏了一些东西,因为我client_settings.py
肯定没有产生如此可怕的电话。谁能开导我?
更新
这里的实际用例是重构django项目设置文件,将特定于应用程序的设置移动到该应用程序中的设置文件中。目前,所有设置都在主设置文件中,这已经变得无法维持。我需要保留从其他设置文件(from foo_project.client_settings import *
)覆盖以这种方式定义的任何设置的功能,该文件将在设置文件的底部导入为from app.settings import *
。
为每个应用程序执行{{1}}都可以,但我想从已安装的应用程序设置中启用此功能以保持干净。