【问题标题】:Python: pyflakes not interpreting noqa commentPython:pyflakes 不解释 noqa 注释
【发布时间】:2020-07-11 07:35:36
【问题描述】:

pyflakesnoqa cmets 发生了一些奇怪的事情。

我有一个类似于下面的课程 (MyExample):

  • 它是名为pyflakes_f811_test 的目录中的唯一文件。
  • 它只继承自abc.ABC
  • 我使用typing.overload 重载类中的方法。

从命令行消息 redefinition of unused 'enter_yes_no' from line 25 调用 pyflakes。因此,我添加了# noqa: F811 cmets,但消息并没有消失。

我的问题

  • 有人知道这里发生了什么吗?
  • 是否有任何已知原因会发生这种情况?
  • 有关调试此问题的任何提示?

源代码

姓名:pyflakes_f811_overload.py

#!/usr/bin/env python3

"""Testing pyflakes F811."""


from abc import ABC
from enum import Enum
from typing import overload, Union


class YesNoOptions(Enum):
    """Enum representing basic states of a yes/no."""

    YES = "YES"
    NO = "NO"


class MyExample(ABC):  # pylint: disable=too-few-public-methods
    """Example class."""

    # pylint: disable=no-self-use
    @overload
    def enter_yes_no(self, input_: YesNoOptions):
        """Enter yes/no using an enum."""
        ...

    # pylint: disable=no-self-use
    @overload  # noqa: F811
    def enter_yes_no(self, input_: str):
        """Enter yes/no using a string."""
        ...

    def enter_yes_no(self, input_: Union[YesNoOptions, str]):  # noqa: F811
        """Enter yes/no."""
        if isinstance(input_, str):
            parsed_input = input_.upper()
        elif isinstance(input_, YesNoOptions):
            parsed_input = input_.value
        else:
            raise NotImplementedError(
                f"Did not implement yes/no parsing for input {repr(input_)} of "
                f"type {type(input_)}."
            )

        print(f"User entered: {parsed_input}")


复制

pyflakes 是通过命令行调用的:

(pyflakes_venv) ➜  pyflakes_f811_test pyflakes ./pyflakes_f811_overload.py
./pyflakes_f811_overload.py:28: redefinition of unused 'enter_yes_no' from line 22
./pyflakes_f811_overload.py:33: redefinition of unused 'enter_yes_no' from line 28

软件包版本:

python==3.6.5
pycodestyle==2.4.0
pyflakes==2.1.1
prospector==1.2.0

【问题讨论】:

  • 使用代码示例、.prospector.yml 的配置和您提供的包版本重现 lint 警告证明是不成功的。你能提供一个可重现的设置吗?
  • @OluwafemiSule 我更新了消除prospector 的问题,使其更具重现性。现在有什么想法,你能复制吗?
  • 在某些时候,您可能需要考虑这种重载函数所提供的灵活性是否真的值得为让您的工具接受它所付出的努力。
  • @IntrastellarExplorer 你确定 Pyflakes 支持noqa cmets 吗?我在任何地方都找不到这个记录。您可能想改用 flake8 并查看此帖子:stackoverflow.com/questions/5033727/…
  • 在这种情况下,要求调用者使用enter_yes_no(YesNoOptions("YES")),而不是直接支持enter_yes_no("YES"),是不是太过分了?记住 one 接受的类型比记住接受哪些 k 类型要容易得多。 (“我可以直接传递True,还是必须先将其转换为"YES"YesNoOptions.YES?”)

标签: python pyflakes pycodestyle


【解决方案1】:

Pyflakes 不支持 noqa cmets 忽略特定行。你可以在他们的源代码https://github.com/PyCQA/pyflakes 中查看没有提到noqanoqa 功能仅在 flake8 中。由于 flake8 使用 Pyflakes,我建议你切换到 flake8:

pip install flake8
flake8 ./pyflakes_f811_overload.py

对于您的 @overload 装饰器的特殊问题,虽然它已在 master 分支 (#435) 中修复,但尚未发布(截至 2020 年 4 月 2 日)。

猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2018-10-12
  • 1970-01-01
  • 2011-12-07
  • 2011-03-18
相关资源
最近更新 更多