检查'除了ImportError'内的模块名称

Maj*_*cRa 17 python exception-handling importerror pycharm

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问题(谷歌显示此类检查的问题)

问题:

  1. 当你"除了ImportError"之外,真的值得检查名字吗?即使在简单的情况下(没有some action之后import MySQLdb)?

  2. 如果值得检查,上面的例子是正确的方法吗?如果不是 - 什么是正确的方法?

PS MySQLdb只是系统中可能缺少的模块的一个示例.

Tad*_*sen 20

我认为您误解了警告,如果您没有定义MySQLdb在except块中调用的变量,那么稍后当您尝试使用该模块时,您会得到NameError:

try:
    import foo
except ImportError:
    pass

foo.say_foo() #foo may or may not be defined at this point!
Run Code Online (Sandbox Code Playgroud)

如果该模块仅用于该try:子句,那么这不是问题.但是对于更一般的情况,检查器希望您在except块中定义变量:

try:
    import foo
except ImportError:
    foo = None  #now foo always exists

if foo: #if the module is present
    foo.say_foo()
else:
    print("foo") #backup use
Run Code Online (Sandbox Code Playgroud)