Python导入模块仅触发副作用不保留在本地命名空间的更优方案
方案1:直接调用内置__import__函数(最简洁)
直接传入模块名调用内置的__import__函数即可触发模块导入的全部副作用,且不会在当前命名空间绑定模块对象,无需额外del操作:
__import__('foo_a') __import__('foo_b')
这种写法比你原来的import foo再del foo少写一半代码,是满足你需求的最简写法。
方案2:用importlib批量导入(更易维护)
如果你需要导入的子类模块数量较多,更推荐用标准库importlib的import_module做批量导入,后续新增模块只需要更新列表即可,代码更易维护:
import importlib # 所有需要导入触发注册的模块列表 SUBMODULES = [ 'foo_a', 'foo_b', 'foo_c' ] for mod in SUBMODULES: importlib.import_module(mod)
这种写法同样不会在命名空间留下多余的模块引用,也是Python插件化、自动注册类场景下的常用实现惯例。
补充说明
你原本的import xxx; del xxx写法本身也完全符合Python规范,可读性很高,只是在模块数量较多时写起来比较繁琐。
另外不用担心上述两种写法会影响子类注册逻辑:模块只要被导入过就会常驻sys.modules,你需要的子类注册副作用会完整保留,完全可以正常调用Base.get_subclass()获取对应子类。
内容的提问来源于stack exchange,提问作者KQS
相关产品推荐
相关产品推荐

