[PATCH 1 of 2 RFC] util: adding support for defaultdict

Nicolas Dumazet nicdumz at gmail.com
Fri Aug 21 10:43:11 CDT 2009


# HG changeset patch
# User Nicolas Dumazet <nicdumz.commits at gmail.com>
# Date 1250845059 -7200
# Node ID 3bd9d3f0ad0702cfc55470cb5f1beaeaee7fbc92
# Parent  b34184c046acccfff8c52310541f2813418a9993
util: adding support for defaultdict

defaultdict is available from Python 2.5

diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -36,6 +36,30 @@
     _fastsha1 = sha1 = _sha1
     return _sha1(s)
 
+def defaultdict(factory):
+    return _fastdefaultdict(factory)
+
+def _fastdefaultdict(factory):
+    # Import defaultdict from collections if available
+    # or implement it in Python, and overwrite itself
+    # with it on the first call.
+    try:
+        # Python >= 2.5
+        from collections import defaultdict as _defaultdict
+    except ImportError:
+        # Python 2.4
+        class _defaultdict(dict):
+            def __init__(self, factory):
+                dict.__init__(self)
+                self.factory = factory
+
+            def __getitem__(self, key):
+                return self.setdefault(key, self.factory())
+
+    global _fastdefaultdict
+    _fastdefaultdict = _defaultdict
+    return _defaultdict(factory)
+
 import subprocess
 closefds = os.name == 'posix'
 def popen2(cmd):


More information about the Mercurial-devel mailing list