Skip to content

Warn about certain sequences of chained comparisons #690

@JelleZijlstra

Description

@JelleZijlstra

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions