【发布时间】:2014-08-07 12:38:27
【问题描述】:
我为 XBMC 编写了一个脚本,它可以选择下载一个 dll,然后在下载成功时导入一个依赖于该 dll 的模块。 但是,将导入放在函数中会生成 Python 语法警告。 简化示例:
1 def importIfPresent():
2 if chkFunction() is True:
3 from myOptionModule import *
第 3 行会生成警告,但不会停止脚本。我不能将此代码放在函数的开头,因为我需要生成对话框来提示下载,然后在下载文件后对文件进行哈希处理以检查是否成功。我还在启动时调用了相同的代码,以检查用户是否已经下载了 dll。
是否有其他/更好的方法可以在不生成语法警告的情况下执行此操作?还是我应该忽略警告并保持原样?
谢谢!使用下面的有用回复,我现在有:
import importlib
myOptionalModule = None
def importIfPresent():
if chkFunction is True:
try:
myOptionalModule = importlib.import_module('modulex')
except ImportError:
myOptionalModule = None
...
importIfPresent()
...
def laterFunction():
if myOptionalModule != None:
myParam = 'something expected'
myClass = getattr(myOptionalModule, 'importClassName')
myFunction = getattr(myClass, 'functionName')
result = myFunction(myClass(), myParam)
else:
callAlternativeMethod()
我发回这篇文章主要是为了与像我这样的其他初学者分享我通过讨论学到的如何使用以这种方式导入的模块的功能而不是标准的导入语句。我相信专家们也会分享更优雅的方法......
【问题讨论】:
-
您收到的警告是什么?
-
语法警告:import * 只允许在模块级别
-
啊,明白了。解决方案是指定要导入的名称,真的。无论如何你都应该这样做。
-
我同意这一点。毫无疑问,关键是除非使用更多魔法来调用库中的函数,否则代码实际上必须使用它想要调用的函数的名称。所以按名称导入它们是有意义的。