使用importlib.import_module能否实现from 模块 import *的导入效果?
解决方案
你可以通过操作当前作用域的变量字典,模拟from 模块 import *的导入逻辑,实现动态导入模块后批量覆盖当前作用域的同名变量。
核心实现逻辑
from 模块 import *的本质规则是:
- 如果目标模块定义了
__all__列表,就只导入列表中声明的所有属性 - 如果模块没有定义
__all__,就导入所有名称不带下划线前缀的属性
我们只需要按照这个规则把模块属性批量更新到当前作用域的字典即可。
代码示例
针对你的场景,修改后的代码如下:
from importlib import import_module A = 'a' m = 'module_x' # m会作为参数动态传入 x = import_module(m) # 模拟from import *的规则筛选要导入的属性 if hasattr(x, '__all__'): import_attrs = x.__all__ else: import_attrs = [attr for attr in dir(x) if not attr.startswith('_')] # 批量更新全局作用域的变量,覆盖同名变量 globals().update({attr: getattr(x, attr) for attr in import_attrs}) print(A) # 输出结果为 x,符合预期
注意事项
- 如果你是在函数内部执行该逻辑,不要使用
locals().update()批量写入局部作用域,Python官方明确说明修改locals()字典不会生效。这种场景下要么显式赋值A = x.A,要么把导入的属性放到自定义字典中使用。 - 该方法和原生
from import *一样存在同名变量覆盖的风险,使用前请确认命名冲突问题。 - 如果你只需要导入特定的变量(比如仅需要A),可以直接简化为
globals()['A'] = x.A,无需批量处理。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

