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.
--- 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