pyflakes icon indicating copy to clipboard operation
pyflakes copied to clipboard

Warn about certain sequences of chained comparisons

Open JelleZijlstra opened this issue 3 years ago • 1 comments

I was pointed to this buggy line:

  if x is None != y is None:

(For context, Python allows chaining any of the comparison operators ==, !=, is, is not, >, >=, <, <=, in, not in. a OP b OP c is equivalent to a OP b and b OP c except that b is only evaluated once.)

I find it hard to imagine a use case for combining is and != in the same chained comparison, so it would be useful for linters to warn about this and similar patterns.

In my company's internal linter, I implemented a check that disallows all chained comparison pairs except == + ==, is + is, </<= + </<=, and >/>= + >/>=.

It found one false positive where someone had intentionally written == + !=, but I'd argue it's clearer with and:

-                        value.fullName == existing.fullName != "*"
+                        (value.fullName == existing.fullName and value.fullName != "*")

Would pyflakes be interested in a similar check?

JelleZijlstra avatar May 04 '22 16:05 JelleZijlstra

I think this probably makes more sense in flake8-bugbear (slightly more opinionated checks) but I definitely agree on making this an error! (it could go here as well, might want to check popular packages to see how many would get tripped by a new check)

asottile avatar May 04 '22 17:05 asottile