为什么 `default` 在这个 python class 中是一个 flake8 错误?

Why is `default` a flake8 error in this python class?

import typing
from dataclasses import dataclass


@dataclass
class Parameter:
    default: typing.Any = None

我在第 7 行收到 flake8 错误:

    default: typing.Any = None

错误是:

    E704 multiple statements on one line (def)

这是 flake8 解析中的错误吗?

所以,有好消息也有坏消息。

  • flake8 is just a wrapper around a set of other tools, including pycodestyle.
  • 好消息是,据我所知,这个问题出现在 pycodestyle 2.3.1 中,并已在 2.4.0 中修复。
  • 坏消息是目前的flake8版本3.5.0号称不兼容pycodestyle 2.4.0。 (请参阅 the flake8 FAQ 了解为什么他们甚至不尝试与包装工具在未来兼容。)
  • 好消息是,如果您愿意安装 GitLab 或 GitHub,当前的 flake8 master 支持 pycodestyle 2.4.x(以及 pyflakes 2.0.x).
  • 坏消息是尚未分配 post-3.5.0 里程碑,这意味着没有人声称当前的 tip-of-tree 已经过测试并且稳定并准备好发布,而且大多数可能他们实际上还没有完成 2.4.0 的测试,他们只是更改了版本,因为这是他们打算支持的版本。

如果我在干净的 3.7 环境中安装 pycodestyle 2.3.1 和 flake8 3.5.0(以及 pyflakes 1.6.0),我可以重现此警告。

如果我强制 pip 安装 pycodestyle 2.4.0,即使 flake8 抱怨它,警告也会消失。

如果我从 GitLab 安装 flake8,它会拖入 pycodestyle 2.4.0(和 pyflakes 2.0.0),然后警告再次消失。

这并不奇怪,因为 2.4.0 声称添加 Python 3.7 支持(即使它的 PyPI 条目仍然只列出 3.6),并修复了与 E704 相关的多个错误,例如 this one,但我无法通过快速扫描找到具体的相关更改。


不幸的是,由于 flake8 实际上还没有在 2.4.0 上进行过测试,因此以这种方式修复问题(无论是强行安装不兼容的版本,还是从 GitLab 安装最新版本)可能会破坏其他东西。

在这种情况下,唯一的实际选项是:

  • 无论如何都要去做,祈祷吧。
  • 运行 pycodestyle 手动而不是通过 flake8。 (这意味着它的输出不会与其他工具逐个文件合并,它不会理解由 flake8 等添加的更强大的 noqa 标志)
  • 等待 flake8 达到​​正式支持 pycodestyle 2.4.0 的里程碑(或帮助他们实现)。
  • 在 pycodestyle 存储库中找到您需要的修复程序并将其反向移植到 2.3.1。
  • 禁用此警告(每行、每个文件或全局)。