检查'除了ImportError'

时间:2016-03-09 19:46:31

标签: python exception-handling pycharm importerror

try:
   import MySQLdb
   # some action
except ImportError as err:
   # fallback code

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

PyCharm警报仍然存在,但它可能只是一个PyCharm问题(谷歌显示此类检查的问题)

问题:

  1. 当你“除了ImportError”之外,是否值得检查名称?即使在简单的情况下(some action之后没有import MySQLdb)?

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

  3. P.S。 MySQLdb只是系统中可能缺少的模块的一个示例。

4 个答案:

答案 0 :(得分:16)

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

try:
    import foo
except ImportError:
    pass

foo.say_foo() #foo may or may not be defined at this point!

如果模块仅用于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

答案 1 :(得分:4)

在Python 3.3+中,ImportError具有属性FromRetailer,用于指示导入失败的模块的名称。当然,MySQLdb会暗示你已经陷入了Python 2。

答案 2 :(得分:2)

已经提到的一种获取名称的方法是使用name属性:

try:
    import pty
except ImportError as e:
    print(e.name)

但是,重要的是要注意,您可能可能无法获得开始使用的模块名称。也就是说,在Windows上运行上述命令会为您提供termios,而不是pty

要保持与python 2.7的兼容性(对于尚未进行切换的用户,您使用的是clock

try:
    import pty
except ImportError as e:
    print(e.args[0].rsplit(' ',1)[-1])  # `msg` attribute is `message` on python2...stick with args

# prints the same result: termios


一些奖励花絮:

  • Python 3.6于2016年底发布。由于版本为2019+,因此您可以选择更清晰的异常ModuleNotFoundError

      

    ImportError的子类,当找不到模块时,由导入引发。在sys.modules中找不到None时,也会引发此错误。

  • 如果您使用的是Python 3.3+,请不要忘记path属性(除了已经提到的name之外),该属性还提供了引发异常(仅在更复杂的情况下有用-在我给path的示例中,这些简单示例将返回None。)

答案 3 :(得分:-1)

尝试一下:

try:
  import libname
except ImportError as e:
       e = e[0][16:]
       print("\n[!] Error: Please Install Module Name:[ {} ] And Try Again !!!".format(e))
       exit(1)

输出:

  

[!]错误:请安装模块名称:[libname]并重试!!!