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问题(谷歌显示此类检查的问题)
问题:
当你“除了ImportError”之外,是否值得检查名称?即使在简单的情况下(some action
之后没有import MySQLdb
)?
如果值得检查,以上示例是正确的方法吗?如果不是 - 什么是正确的方式?
P.S。 MySQLdb只是系统中可能缺少的模块的一个示例。
答案 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]并重试!!!