Skip to content
Snippets Groups Projects
Commit 53391819 authored by Adrian Buehlmann's avatar Adrian Buehlmann
Browse files

check-code: catch Python 'is' comparing number or string literals

The Python 'is' operator compares object identity, so it should
definitely not be applied to string or number literals, which Python
implementations are free to represent with a temporary object.

This should catch the following kinds of bogus expressions (examples):

  x is 'foo'     x is not 'foo'
  x is "bar"     x is not "bar"
  x is 42        x is not 42
  x is -36       x is not -36

As originally proposed by Martin Geisler, amended with catching
negative numbers.
parent da69a159
No related merge requests found
......@@ -149,6 +149,7 @@
(r'raise Exception', "don't raise generic exceptions"),
(r'ui\.(status|progress|write|note|warn)\([\'\"]x',
"warning: unwrapped ui message"),
(r' is\s+(not\s+)?["\'0-9-]', "object comparison with literal"),
]
pyfilters = [
......
......@@ -52,3 +52,44 @@
> y = format(x)
any/all/format not available in Python 2.4
[1]
$ cat > is-op.py <<EOF
> # is-operator comparing number or string literal
> x = None
> y = x is 'foo'
> y = x is "foo"
> y = x is 5346
> y = x is -6
> y = x is not 'foo'
> y = x is not "foo"
> y = x is not 5346
> y = x is not -6
> EOF
$ "$check_code" ./is-op.py
./is-op.py:3:
> y = x is 'foo'
object comparison with literal
./is-op.py:4:
> y = x is "foo"
object comparison with literal
./is-op.py:5:
> y = x is 5346
object comparison with literal
./is-op.py:6:
> y = x is -6
object comparison with literal
./is-op.py:7:
> y = x is not 'foo'
object comparison with literal
./is-op.py:8:
> y = x is not "foo"
object comparison with literal
./is-op.py:9:
> y = x is not 5346
object comparison with literal
./is-op.py:10:
> y = x is not -6
object comparison with literal
[1]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment