【问题标题】:"Unused import warning" and pylint“未使用的导入警告”和 pylint
【发布时间】:2012-08-14 16:51:08
【问题描述】:

所以我正在使用 Python 开发一个项目,并试图通过 pylint 和一般 .所以,我有一个源文件,(我们就叫它a.py)

#a.py
import loggingsetup

def foo():
   log.info("This is a log message")

但是,我想控制日志的样子,所以在 loggingsetup 我有类似的东西:

#loggingsetup.py
import logging

logging.root.setLevel(logging.DEBUG)

consoleOut = logging.StreamHandler()
consoleOut.setLevel(logging.INFO)  
consoleOut.setFormatter(logging.Formatter("\t"+logging.BASIC_FORMAT))
logging.root.addHandler(consoleOut)

#etc

现在,这似乎工作正常。我想作为一个初步问题,我应该问这是否是解决此问题的正确方法,或者是否有一种不同的方式来构建我的代码更可取。

但我的主要问题是,当我在 a.py 上运行 pylint 时,我会收到类似“未使用的导入 - 导入 loggingsetup”的警告,因为我实际上并没有从 loggingsetup 调用任何方法或函数。

我可以做一些事情,比如将 loggingsetup 的主体重新定义为一个函数并调用它,但这似乎很愚蠢且容易出错(如果我确实从其他地方导入 loggingsetup,我不得不担心调用它两次,如果我了解 python 如何处理导入,这不是我当前设置的问题)。

我显然可以告诉 pylint 忽略警告,但我想我会先在这里询问以确保这实际上不是我应该以不同方式处理的事情。

【问题讨论】:

  • 导入一个模块只是为了它的副作用对我来说是错误的。它使您的代码的意图更难辨别。显式优于隐式。
  • 这只是一个警告,您可能忘记了某些事情和/或可能正在做一些不必要的事情。如果不是这种情况,请忽略它。
  • 我有点不同意 martineau 的上述观点。是的,有时事情就是这样,你必须忽略警告,但通常警告不应该被视为“友好提醒”并且在不确定的情况下忽略,这就是为什么我要确定我可以忽略它,或者获得更好的方法。

标签: python warnings pylint


【解决方案1】:

如果您使用pylint 和 flake8,您可以通过这种方式忽略两个工具中未使用的导入警告:

import loggingsetup  # noqa # pylint: disable=unused-import

【讨论】:

  • “第二条评论”开始前好像需要两个空格:`#noqa#pylint:disable=unused-import`
【解决方案2】:

在这种情况下,您仍然可以明确告诉 pylint 这个未使用的导入是有意的:

import loggingsetup # pylint: disable=unused-import

请注意,该指令与导入位于同一行,因此 W0611 仅对这一行禁用,而不是对下面的所有块禁用。

【讨论】:

    【解决方案3】:

    我的导入路径很长,由于行大小的限制,它跨越了多行。我必须确保在导入的第一行而不是最后一行使用# noqa。例如

    from this.could.be.a.very.long.path import (  # noqa
    some_method,
    )
    

    【讨论】:

      【解决方案4】:

      你也可以

      assert loggingsetup
      

      把棉绒从你的背上拿下来

      【讨论】:

        【解决方案5】:

        我将使用的方法是使用loggingsetup 作为logging 的一种包装器。

        import logging
        
        # set up logging config here
        
        from logging import *
        

        然后在你的其他模块中:

        import loggingsetup as logging
        

        在这种情况下,您可能希望使用 loggingsetup 以外的名称,例如tweaked_logging 或 logging_with_my_settings。

        【讨论】:

        • 从我最初的警告的角度来看,这是可行的,我绝对喜欢这个想法。现在我有 pylint 抱怨通配符导入,以及 loggingsetup.py 中所有未使用的导入(尽管我接受了你的建议并重命名了它)
        • 我没有尝试过,但是将# pylint: disable-msg-cat= 注释放在包装模块的顶部应该可以让您仅在该模块中禁止指定类别的警告。至少您已将所有“坏处”隔离到一个模块中。 :-)
        【解决方案6】:

        正如您所提到的,您将其包装在一个函数中并显式调用设置将解决此警告。正如 Steven 所提到的,这将被认为是更好的代码,因为它更明确地说明了你在做什么。

        如果你担心调用这个函数两次,你当然可以使用一个模块实习生标志来允许函数体只执行一次。

        __initialized = False
        
        def init():
            if not __initialized:
                __initialized = True
                #DoStuff
        

        【讨论】:

        • 是的,这会起作用,但我不禁觉得这样做有点牺牲“简单胜于复杂”。它不会包装脚本的主体,但我还必须记住将函数调用添加到任何导入。不可怕,但也没有那么简单。在某些情况下这将是一个不错的选择,但在这种情况下,我认为 kindall 的答案是更好的答案。
        【解决方案7】:

        您的代码应该在主脚本中调用一次的函数中

        【讨论】:

          【解决方案8】:

          这是满足警告的方法(vscode + pylint);

          from array import array
          ar = array('i', [])
          

          所以不再使用通配符,而是再次指定“数组”方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-12
            • 2011-05-19
            • 2020-05-26
            • 1970-01-01
            • 2022-08-09
            相关资源
            最近更新 更多