我正在编写一个函数来检查导入文件/模块是否包含任何错误。当我使用模块名称作为变量时,该函数由于某些原因失败。
有效
def importfile1():
try:
from test2 import bea
print('1st scenario:', 'import is successful')
except:
print('1st scenario:', 'import failed')
importfile1()
不起作用
def importfile2(bank):
try:
from test2 import bank
print('2nd scenario:', 'import is successful')
except:
print('2nd scenario:', 'import failed')
importfile2(bea)
我希望这两个函数都可以工作。但是,第二个函数失败了。
结果如下所示:
1st scenario: import is successful
2nd scenario: import failed
请问第二个函数失败的原因是什么?
第二个函数失败的原因在于,在
from test2 import bank
语句中,
bank
被解释为要导入的
名称
,而不是一个
变量
。换句话说,Python尝试从
test2
模块中导入名为
bank
的东西,而不是使用
bank
变量的值(即
bea
)。
为了实现你想要的功能,你需要使用
importlib
模块。
importlib
允许你动态导入模块和属性。
以下是修改后的
importfile2
函数:
import importlib
def importfile2(module_name, attribute_name):
try:
module = importlib.import_module(module_name)
attribute = getattr(module, attribute_name)
print('2nd scenario:', 'import is successful')
return attribute
except (ImportError, AttributeError):
print('2nd scenario:', 'import failed')
bea = importfile2('test2', 'bea')
在这个修改后的代码中:
-
我们首先使用
importlib.import_module(module_name)
动态导入名为module_name
的模块。 -
然后,我们使用
getattr(module, attribute_name)
从导入的模块中获取名为attribute_name
的属性。 - 如果导入或获取属性成功,我们将打印成功消息并返回获取的属性。
-
如果出现
ImportError
(模块无法导入)或AttributeError
(模块中不存在该属性),我们将打印失败消息。
现在,当你调用
importfile2('test2', 'bea')
时,它将从
test2
模块成功导入
bea
。