跳到内容

any-eq-ne-annotation (PYI032)

源自 flake8-pyi 代码检查器。

修复总是可用的。

作用

检查 __eq____ne__ 的实现,它们使用 typing.Any 作为其第二个参数的类型注解。

为什么这不好?

Python 文档建议使用 object 来“以类型安全的方式指示一个值可以是任何类型”。另一方面,Any 应该被视为“在需要混合动态和静态类型代码时的逃生出口”。由于使用 Any 允许你编写高度不安全的代码,因此通常只有在你的代码的语义在类型检查器看来无法表达时才应该使用 Any

Python 中的期望是,使用 ==!= 比较两个任意对象永远不应该引发异常。这个契约可以在类型系统中完全表达,并且不涉及从类型检查器请求不健全的行为。因此,对于实现这些比较运算符(__eq____ne__)的方法的第二个参数,objectAny 更合适的注解。

示例

from typing import Any

class Foo:
    def __eq__(self, obj: Any) -> bool: ...

建议改为

class Foo:
    def __eq__(self, obj: object) -> bool: ...

参考