Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查内部的模块名称';除进口恐怖主义';_Python_Exception Handling_Pycharm_Importerror - Fatal编程技术网

Python 检查内部的模块名称';除进口恐怖主义';

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

PyCharm给出了代码检查警告:

try块中带有“except ImportError”的“MySQLdb”也应在except块中定义

此检查检测应解析但不解析的名称。由于动态分派和duck类型,这在数量有限但有用的情况下是可能的。顶级和类级项目比实例项目更受支持

好的,我认为这个警告是合理的,因为
回退代码
假设没有安装“MySQLdb”,而可能是一些不同的错误引起了错误。所以我用了这样的方法:

try:
   import MySQLdb
   # some action
except ImportError as err:
   # fallback code
PyCharm警报仍然存在,但可能只是PyCharm问题(谷歌显示了此类检查的问题)

问题:

  • 当你“除了恐怖”的时候,真的值得查一下名字吗?即使在简单的情况下(导入MySQLdb后没有
    某些操作

  • 如果值得检查,上面的例子是正确的方法吗?如果没有-正确的方法是什么


  • 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

      try:
         import MySQLdb
         # some action
      except ImportError as err:
         if "MySQLdb" in repr(err):
             # fallback code
         else:
             raise
      
      ImportError的子类,当找不到模块时由import引发。在sys.modules中找不到时也会引发此问题

    • 如果您使用的是Python 3.3+,请不要忘记
      path
      属性(除了前面提到的
      name
      ),该属性提供引发异常的任何文件的路径(仅在更复杂的情况下有用——在像我给出的
      path
      这样的简单示例中将返回
      None


    这可能会有帮助:还有这个:谢谢!你提出的问题接近主题。然而,我问的是稍微不同的上下文。所以只需将MySQLdb设置为None就可以消除警告。感谢“除了importorror作为别名:”这回答了一个非常令人困惑的问题也许你是对的。。。在我的上下文中,我只是不认为问题在于命名错误,因为我在回退中实际做的是
    。。。连接\u string.replace(“mysql://”、“mysql+mysqlconnector://”)
    所以我的想法离命名错误太远了。如果以后不使用该模块,请将其从名称空间中删除以指示pycharm(以及您自己),这样您就不会遇到命名错误如果我不能导入库,我只需
    返回
    。我认为这种行为也是可以接受的。当使用python版本更改错误消息时会发生什么?(这以前发生过)。而且。。。谢谢你花时间回答这个问题,但这个答案不是针对这个问题的。