【发布时间】:2020-07-11 07:35:36
【问题描述】:
pyflakes 和 noqa 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 支持
noqacmets 吗?我在任何地方都找不到这个记录。您可能想改用 flake8 并查看此帖子:stackoverflow.com/questions/5033727/… -
在这种情况下,要求调用者使用
enter_yes_no(YesNoOptions("YES")),而不是直接支持enter_yes_no("YES"),是不是太过分了?记住 one 接受的类型比记住接受哪些k类型要容易得多。 (“我可以直接传递True,还是必须先将其转换为"YES"或YesNoOptions.YES?”)
标签: python pyflakes pycodestyle