any-eq-ne-annotation (PYI032)
Added in v0.0.271 · Related issues · View source
Derived from the flake8-pyi linter.
Fix is always available.
What it does
Checks for __eq__ and __ne__ implementations that use typing.Any as
the type annotation for their second parameter.
Why is this bad?
The Python documentation recommends the use of object to "indicate that a
value could be any type in a typesafe manner". Any, on the other hand,
should be seen as an "escape hatch when you need to mix dynamically and
statically typed code". Since using Any allows you to write highly unsafe
code, you should generally only use Any when the semantics of your code
would otherwise be inexpressible to the type checker.
The expectation in Python is that a comparison of two arbitrary objects
using == or != should never raise an exception. This contract can be
fully expressed in the type system and does not involve requesting unsound
behaviour from a type checker. As such, object is a more appropriate
annotation than Any for the second parameter of the methods implementing
these comparison operators -- __eq__ and __ne__.
Example
Use instead: