为何使用变量作为导入名称时,from...import动态导入失败?
问题原因及解决方法
失败核心原因
1. 静态导入不支持变量替换
Python的from ... import ...属于静态导入语法,这里的导入名称会被当作字面量字符串处理,而非变量。在你的importfile2函数中:
from test2 import bank
Python会直接去test2模块里查找名为bank的成员,不会使用你传入的函数参数bank的值(也就是你期望的bea)。但你的test2模块只有bea,没有bank,因此导入失败。
2. 调用时的前置错误
你调用importfile2(bea)时,bea还未被导入到当前作用域,这本身会触发NameError,但因为你用了except:捕获所有异常,这个错误被掩盖,最终只输出"import failed"。
正确的动态导入方式
要实现用变量指定导入成员的需求,需要使用Python的动态导入工具,比如importlib模块:
import importlib def importfile2(bank_name): try: test2 = importlib.import_module('test2') # 根据变量名获取模块中的成员 member = getattr(test2, bank_name) # 可选:将成员绑定到当前作用域 globals()[bank_name] = member print('2nd scenario:', 'import is successful') except Exception as e: print('2nd scenario:', f'import failed: {str(e)}') # 传入字符串形式的成员名称 importfile2('bea')
这样就能根据传入的变量名,动态导入test2模块中的对应成员。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

