Python 检查内部的模块名称';除进口恐怖主义';
PyCharm给出了代码检查警告: try块中带有“except ImportError”的“MySQLdb”也应在except块中定义 此检查检测应解析但不解析的名称。由于动态分派和duck类型,这在数量有限但有用的情况下是可能的。顶级和类级项目比实例项目更受支持 好的,我认为这个警告是合理的,因为Python 检查内部的模块名称';除进口恐怖主义';,python,exception-handling,pycharm,importerror,Python,Exception Handling,Pycharm,Importerror,PyCharm给出了代码检查警告: try块中带有“except ImportError”的“MySQLdb”也应在except块中定义 此检查检测应解析但不解析的名称。由于动态分派和duck类型,这在数量有限但有用的情况下是可能的。顶级和类级项目比实例项目更受支持 好的,我认为这个警告是合理的,因为回退代码假设没有安装“MySQLdb”,而可能是一些不同的错误引起了错误。所以我用了这样的方法: try: import MySQLdb # some action except Imp
回退代码
假设没有安装“MySQLdb”,而可能是一些不同的错误引起了错误。所以我用了这样的方法:
try:
import MySQLdb
# some action
except ImportError as err:
# fallback code
PyCharm警报仍然存在,但可能只是PyCharm问题(谷歌显示了此类检查的问题)
问题:
某些操作
)
p.S.MySQLdb只是系统中可能缺少的模块的一个示例。在Python 3.3+中,an具有属性
name
,该属性告诉导入失败的模块的名称。当然,MySQLdb会提示您使用Python 2。我想您误解了警告,如果您没有在except块中定义一个名为MySQLdb
的变量,那么稍后当您尝试使用该模块时,您会得到一个namererror
:
try:
import MySQLdb
# some action
except ImportError as err:
if "MySQLdb" in repr(err):
# fallback code
else:
raise
如果模块仅在try:
子句中使用,则这不是问题。但对于更一般的情况,检查器希望您在except块中定义变量:
try:
import foo
except ImportError:
pass
foo.say_foo() #foo may or may not be defined at this point!
如果模块仅在try块中使用,则您可以通过从命名空间中删除该模块来向检查者(以及您自己)指示以后不能使用该模块:
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
试试这个:
try:
import foo
except ImportError:
pass
else:
# if it was able to import use it then get rid of the local variable
foo.do_thing()
del foo #optional module should not be relied on outside
# now foo never exists here, checker is happy.
输出:
[!]错误:请安装模块名:[libname]并重试
前面提到的一种获取名称的方法是使用
name
属性:
试试看:
进口公司
除e以外:
打印(如姓名)
但是,需要注意的是,您可能无法获得开始时使用的模块名称;也就是说,在Windows上运行上述命令会将termios
作为输出,而不是pty
为了保持与Python2.7的兼容性(对于那些没有进行切换的用户,您可以使用)
试试看:
进口公司
除e以外:
print(e.args[0].rsplit(“”,1)[-1])#`msg`属性是python2上的`message`……请使用args
#打印相同的结果:termios
一些花絮:
- Python 3.6于2016年底发布。由于是2019+,您可以选择更清晰的异常
:ModuleNotFoundError
ImportError的子类,当找不到模块时由import引发。在sys.modules中找不到时也会引发此问题try: import MySQLdb # some action except ImportError as err: if "MySQLdb" in repr(err): # fallback code else: raise
- 如果您使用的是Python 3.3+,请不要忘记
属性(除了前面提到的path
),该属性提供引发异常的任何文件的路径(仅在更复杂的情况下有用——在像我给出的name
这样的简单示例中将返回path
)None
。。。连接\u string.replace(“mysql://”、“mysql+mysqlconnector://”)
所以我的想法离命名错误太远了。如果以后不使用该模块,请将其从名称空间中删除以指示pycharm(以及您自己),这样您就不会遇到命名错误如果我不能导入库,我只需返回。我认为这种行为也是可以接受的。当使用python版本更改错误消息时会发生什么?(这以前发生过)。而且。。。谢谢你花时间回答这个问题,但这个答案不是针对这个问题的。