From b7bf23cc716a867a0a1d14fc68205849a73968be Mon Sep 17 00:00:00 2001 From: Tarun Kumar Date: Tue, 1 Mar 2016 22:10:50 +0530 Subject: [PATCH] Fix for #12 Native defaultdict for 2.5+ --- utils.py | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/utils.py b/utils.py index c1675890e..08799a475 100644 --- a/utils.py +++ b/utils.py @@ -232,19 +232,32 @@ def Dict(**entries): """ return entries -class DefaultDict(dict): - """Dictionary with a default value for unknown keys.""" - def __init__(self, default): - self.default = default - - def __getitem__(self, key): - if key in self: return self.get(key) - return self.setdefault(key, copy.deepcopy(self.default)) +try: + from collections import defaultdict # Introduced in 2.5 - def __copy__(self): - copy = DefaultDict(self.default) - copy.update(self) - return copy + def DefaultDict(default_value=None): + """Front-end for native 2.5 version defaultdict while + maintaing backward compatibility when not using a callable. + """ + if (default_value is not None and not hasattr(default_value, '__call__')): + default_factory = lambda: copy.deepcopy(default_value) + else: + default_factory = default_value + return defaultdict(default_factory) +except ImportError: + class DefaultDict(dict): + """Dictionary with a default value for unknown keys.""" + def __init__(self, default): + self.default = default + + def __getitem__(self, key): + if key in self: return self.get(key) + return self.setdefault(key, copy.deepcopy(self.default)) + + def __copy__(self): + copy = DefaultDict(self.default) + copy.update(self) + return copy class Struct: """Create an instance with argument=value slots.