check-code: disallow use of dict(key=value) construction
authorAugie Fackler <raf@durin42.com>
Wed, 12 Mar 2014 13:31:27 -0400
changeset 20688 a61ed1c2d7a7
parent 20687 7d4d04299927
child 20689 401f9b661a2d
check-code: disallow use of dict(key=value) construction {} literals are faster and more consistent across Python 2 and 3. Whitelisted the one use of dict() that is using a generator expresion.
contrib/check-code.py
hgext/largefiles/remotestore.py
tests/test-check-code.t
--- a/contrib/check-code.py	Wed Mar 12 13:29:29 2014 -0400
+++ b/contrib/check-code.py	Wed Mar 12 13:31:27 2014 -0400
@@ -200,6 +200,8 @@
      'use "import foo.bar" on its own line instead.'),
     (r'(?<!def)\s+(cmp)\(', "cmp is not available in Python 3+"),
     (r'\breduce\s*\(.*', "reduce is not available in Python 3+"),
+    (r'dict\(.*=', 'dict() is different in Py2 and 3 and is slower than {}',
+     'dict-from-generator'),
     (r'\.has_key\b', "dict.has_key is not available in Python 3+"),
     (r'\s<>\s', '<> operator is not available in Python 3+, use !='),
     (r'^\s*\t', "don't use tabs"),
--- a/hgext/largefiles/remotestore.py	Wed Mar 12 13:29:29 2014 -0400
+++ b/hgext/largefiles/remotestore.py	Wed Mar 12 13:31:27 2014 -0400
@@ -30,7 +30,8 @@
             % (source, util.hidepassword(self.url)))
 
     def exists(self, hashes):
-        return dict((h, s == 0) for (h, s) in self._stat(hashes).iteritems())
+        return dict((h, s == 0) for (h, s) in # dict-from-generator
+                    self._stat(hashes).iteritems())
 
     def sendfile(self, filename, hash):
         self.ui.debug('remotestore: sendfile(%s, %s)\n' % (filename, hash))
@@ -97,4 +98,3 @@
     def batch(self):
         '''Support for remote batching.'''
         return remotebatch(self)
-
--- a/tests/test-check-code.t	Wed Mar 12 13:29:29 2014 -0400
+++ b/tests/test-check-code.t	Wed Mar 12 13:31:27 2014 -0400
@@ -123,6 +123,7 @@
   $ cat > python3-compat.py << EOF
   > foo <> bar
   > reduce(lambda a, b: a + b, [1, 2, 3, 4])
+  > dict(key=value)
   > EOF
   $ "$check_code" python3-compat.py
   python3-compat.py:1:
@@ -131,6 +132,9 @@
   python3-compat.py:2:
    > reduce(lambda a, b: a + b, [1, 2, 3, 4])
    reduce is not available in Python 3+
+  python3-compat.py:3:
+   > dict(key=value)
+   dict() is different in Py2 and 3 and is slower than {}
   [1]
 
   $ cat > is-op.py <<EOF