Python中如何在map()调用里用__import__动态导入子目录模块?
动态导入子目录模块的实现方案
问题场景
正在学习《Dive Into Python》16.15节的动态导入示例,现有代码如下:
modulenames = ['my_module'] modules = list(map(__import__, modulenames)) modules[0].process()
但目标模块位于modules子目录中,常规导入写法为:
from modules import my_module
已知__import__支持fromlist参数,但不清楚如何在map()调用中适配该语法。
解决方案
理解__import__的参数对应关系
from modules import my_module等价于__import__('modules', fromlist=['my_module']),此调用会直接返回my_module对象,而非顶层的modules包。
在map()中传递额外参数
通过lambda函数包装__import__,即可在map()中传入fromlist等额外参数,有两种常用写法:
写法1:指定完整模块路径
modulenames = ['my_module'] modules = list(map(lambda name: __import__(f'modules.{name}', fromlist=['']), modulenames)) modules[0].process()
这里fromlist=['']用于确保__import__返回子模块modules.my_module,而非父包modules。
写法2:模拟from ... import ...语法
modulenames = ['my_module'] modules = list(map(lambda name: __import__('modules', fromlist=[name]), modulenames)) modules[0].process()
此写法直接从modules包中导入指定子模块,返回的就是目标子模块对象。
注意事项
子目录modules下需存在__init__.py文件(Python 3.3+支持命名空间包,但添加该文件更符合规范且兼容性更好),否则Python无法将其识别为可导入的包。
内容的提问来源于stack exchange,提问作者Lieuwe
相关产品推荐
相关产品推荐

