我需要知道是否存在python模块,而不导入它.
导入可能不存在的东西(不是我想要的东西):
try:
import eggs
except ImportError:
pass
Run Code Online (Sandbox Code Playgroud) 我想我的Python unittest模块告诉测试运行器在某些情况下跳过它的全部(例如无法导入模块或找到关键资源).
我可以使用@unittest.skipIf(...)跳过unittest.TestCase类,但是如何跳过整个模块?将跳过应用于每个类是不够的,因为如果模块无法导入,类定义本身可能会导致异常.
try:
import MySQLdb
# some action
except ImportError as err:
# fallback code
Run Code Online (Sandbox Code Playgroud)
PyCharm给出了代码检查警告:
"除了ImportError"的try块中的'MySQLdb'也应该在除块之外定义
此检查检测应解决但不能解析的名称.由于动态调度和鸭子打字,这在有限但有用的情况下是可能的.顶级和类级别项比实例项更受支持.
好吧,我认为警告是合理的,因为fallback code假设没有安装'MySQLdb',而它可能是一些不同的错误,只是引发了ImportError.所以我使用了类似的东西:
try:
import MySQLdb
# some action
except ImportError as err:
if "MySQLdb" in repr(err):
# fallback code
else:
raise
Run Code Online (Sandbox Code Playgroud)
PyCharm警报仍然存在,但它可能只是一个PyCharm问题(谷歌显示此类检查的问题)
问题:
当你"除了ImportError"之外,真的值得检查名字吗?即使在简单的情况下(没有some action之后import MySQLdb)?
如果值得检查,上面的例子是正确的方法吗?如果不是 - 什么是正确的方法?
PS MySQLdb只是系统中可能缺少的模块的一个示例.