“E271:不比较类型,使用 isinstance()”错误

Lab*_*dor 7 python pep8

python PEP 8 linter 不喜欢这样:

assert type(a) == type(b)
Run Code Online (Sandbox Code Playgroud)

它告诉我改用“isinstance()”。但是要使用isinstance我必须做类似的事情

assert isinstance(a, type(b)) and isinstance(b, type(a))
Run Code Online (Sandbox Code Playgroud)

这似乎更笨拙,我真的不明白这一点。

linter 是否以某种我看不到的方式明智?或者我在某些方面是明智的,linter 看不到?

wim*_*wim 5

从评论中添加的上下文:

根据我的程序逻辑,type(a) == type(b)在代码中应该有这一点,我只想断言,看看一切都运行顺利

在这种情况下,您应该忽略 linter,因为它没有暗示任何对您有用的东西。E271 旨在通过类型检查警告人们有关问题,例如:

if type(a) == A:
    ...
Run Code Online (Sandbox Code Playgroud)

上面的例子可能会意外地干扰逻辑流,因为忽略了考虑a是 的子类的实例的可能性A

  • 根据我的经验,Python linter 是一种生硬的工具,而且实现起来相当简单。 (2认同)
  • 我同意这个答案 - 特定的 PEP8 指南是不合理的,因为“isinstance”将包括检查子类,这可能是程序逻辑明确不希望的。您可能需要这样一种情况,其中某种类型完全等于某种预期类型,并且无论鸭子类型或其他什么,子类都将是逻辑错误。真正的缺点来自 flake8、autopep8 和类似的工具,因为现在你必须注释丑陋的“#noqa”编译指示,或者更糟糕的是,更改 .ini 文件以完全忽略不应该存在的 flake8 规则。 (2认同)