能否通过import from语法从importlib导入的模块中导入函数?
问题解答
可以实现类似from something_magic(my_collection) import namedtuple的导入方式,Python本身没有内置这类语法,但可以通过简单的代码模拟出这个效果:
方法一:用临时模块模拟导入
你可以把已加载的模块对象包装成一个临时模块,就能用from ... import ...语法导入目标对象:
import importlib import types my_collection = importlib.import_module('collections') # 创建临时模块并注入目标对象 temp_module = types.ModuleType('temp_mod') temp_module.namedtuple = my_collection.namedtuple # 现在就能用from语法导入 from temp_mod import namedtuple
方法二:自定义上下文管理器实现动态导入
如果想要更贴近something_magic()的调用形式,可以写一个上下文管理器,临时把模块对象注册到sys.modules中:
import importlib import sys from contextlib import contextmanager @contextmanager def something_magic(module_obj): # 生成唯一的临时模块名 temp_name = f"temp_{id(module_obj)}" # 将模块对象注册到系统模块列表 sys.modules[temp_name] = module_obj yield temp_name # 清理临时模块,避免污染 del sys.modules[temp_name] # 使用示例 my_collection = importlib.import_module('collections') with something_magic(my_collection) as mod_name: from mod_name import namedtuple
补充说明
- 两种方法本质上和直接
namedtuple = my_collection.namedtuple的效果一致,只是写法上贴近你想要的导入语法; - 第一种方法更简单直接,适合单次导入场景;第二种方法通过上下文管理器自动清理临时模块,更严谨。
内容的提问来源于stack exchange,提问作者yupbank
相关产品推荐
相关产品推荐

