【问题标题】:Ignore by directory using Pylint使用 Pylint 按目录忽略
【发布时间】:2010-03-23 21:20:59
【问题描述】:

以下来自Pylint documentation

--ignore=<file>
    Add <file or directory> to the black list. It should be a 
    base name, not a path. You may set this option multiple 
    times. [current: %default]

然而,我没有运气让目录部分工作。

我有一个名为 migrations 的目录,其中包含 django-south 迁移文件。当我输入 --ignore=migrations 时,它仍然不断地在 migrations 目录中的文件中向我显示错误/警告。

会不会是--ignore 不适用于目录?

如果我什至可以使用正则表达式来匹配被忽略的文件,它会起作用,因为 django-south 文件都被命名为 0001_something、0002_something...


由于我无法通过目录忽略来工作,我只好将# pylint: disable-msg-cat=WCREFI 放在每个迁移文件的顶部,这会忽略所有 Pylint 错误、警告和信息。

【问题讨论】:

标签: python pylint


【解决方案1】:

将以下内容添加到我的 .pylintrc 文件中适用于 Pylint 0.25:

[MASTER]
ignore=migrations

我的问题在于 PyDev,它(似乎)不尊重我的设置。我认为这是因为它运行 Pylint 每个文件,我认为它绕过了“忽略”检查——无论是模块/目录还是文件。 PyDev 对 Pylint 的调用如下所示:

/path/to/site-packages/pylint/lint.py --include-ids=y /path/to/project/migrations/0018_migration.py

【讨论】:

  • 我可以确认 ignore=migrations 仍然适用于 pylint 1.3.1
  • 对我有用。然而,使用 module-name 就可以了。所以对于像foo/bar 这样的包,我必须使用foo.bar 而不是bar
【解决方案2】:

为了忽略名为3rdparty 的目录树下的子目录,我们将以下ignore-patterns 条目添加到.pylintrc 中的[MASTER] 条目。

# Add files or directories matching the regex patterns to the blacklist. The
# regex matches against base names, not paths.
# Ignore all .py files under the 3rdparty subdirectory.
ignore-patterns=**/3rdparty/**/*.py

这解决了 Pylint 1.7.1 的问题。

我们最初对 cme​​ts 中的“基本名称”子句感到困惑。显然它确实接受带有通配符的路径。至少它对我们有用。

【讨论】:

  • 这似乎对我不起作用(在 pylint 1.9.2 中),首先是因为它不喜欢 **,(我猜他们将其更改为 python 正则表达式解析器)。即使将其设置为适当的正则表达式,ignore-patterns 参数似乎也仅对正在测试的文件的名称进行操作,并且似乎不适用于排除目录
【解决方案3】:

您不能给出路径,而只能给出目录的“基本名称”。例如,使用--ignore=lib 而不是--ignore-=appengine-toolkit/gaetk/lib

问题是您将忽略名为lib所有目录。

【讨论】:

  • 为什么会这样???为什么不忽略整个目录?我必须为目录中的所有文件提供所有文件名或模式???这不是正确的方法
【解决方案4】:

截至目前,--ignore 无法处理目录(GitHub 上有一个未解决的问题,Ignore clause not ignoring directories #2686)。

事实证明,只有文件名,而不是整个路径会针对黑名单进行测试。 (正如在同一个拉取请求中指出的那样:geajack's comment

选项--ignore-patterns也有同样的问题,但是我检查的时候尝试修复它(Add ignore-paths to match against the full path #3266

在您的情况下,目前最好的解决方案是使用正则表达式来匹配您想要在文件中使用的模式,这也是我的情况。由于我不是很精通正则表达式,所以我使用了 Regex101,这是我推荐的。

【讨论】:

    【解决方案5】:

    实际上,Pylint 2.3.1 存在一个未解决的问题。

    如果您将目录设置为忽略选项,它不会忽略它。

    【讨论】:

      【解决方案6】:

      从 Pylint 2.9 开始,将有一个新的配置目录 ignore-paths 匹配正则表达式与整个路径而不是基本名称。

      另见:

      【讨论】:

        【解决方案7】:

        添加到Fabien's answer--ignore-paths 语法如下所示。

        ignore-paths=^src/experiments/.*$,
                     ^src/ingredients/.*$,
                     ^src/scripts/.*$,
                     ^src/tests/.*$
        

        https://github.com/PyCQA/pylint/issues/2686#issuecomment-864585778

        【讨论】:

          【解决方案8】:

          看来你需要做some monkey patching,这适用于我的 Pylint 版本 2.5.3。我只是不知道为什么 Pylint 没有解决忽略路径的方法。

          将此添加到您的 .pylintrc 文件中:

          init-hook=
              sys.path.append(os.getcwd());
              from pylint_ignore import PylintIgnorePaths;
              PylintIgnorePaths('my/thirdparty/subdir', 'my/other/badcode')
          

          然后创建文件pylint_ignore.py

          from pylint.utils import utils
          
          
          class PylintIgnorePaths:
              def __init__(self, *paths):
                  self.paths = paths
                  self.original_expand_modules = utils.expand_modules
                  utils.expand_modules = self.patched_expand
          
              def patched_expand(self, *args, **kwargs):
                  result, errors = self.original_expand_modules(*args, **kwargs)
          
                  def keep_item(item):
                      if any(1 for path in self.paths if item['path'].startswith(path)):
                          return False
          
                      return True
          
                  result = list(filter(keep_item, result))
          
                  return result, errors
          

          【讨论】:

            【解决方案9】:

            然后您可以使用 Bash 扩展来发挥自己的优势:

            --ignore=migrations/{0000..1000}_something
            

            【讨论】:

            • 我认为忽略只允许 basename,所以 migrations/ 不起作用。我也在 Windows 下开发,所以我认为 Bash 是不可能的。
            • 这篇文章看起来有点长,所以我再问一遍。也许有些事情发生了变化。是否可以排除整个migrations 目录?我也在Windows上。 :( 谢谢。
            • 是的,这对我有用。我的行看起来像:ignore=CVS,migrations
            猜你喜欢
            • 1970-01-01
            • 2016-12-28
            • 1970-01-01
            • 2017-05-08
            • 2018-09-27
            • 2021-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多