summaryrefslogtreecommitdiff
path: root/python/m5/smartdict.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/m5/smartdict.py')
-rw-r--r--python/m5/smartdict.py23
1 files changed, 20 insertions, 3 deletions
diff --git a/python/m5/smartdict.py b/python/m5/smartdict.py
index e282bc07b..4ea8210d3 100644
--- a/python/m5/smartdict.py
+++ b/python/m5/smartdict.py
@@ -1,6 +1,23 @@
+# The SmartDict class fixes a couple of issues with using the content
+# of os.environ or similar dicts of strings as Python variables:
+#
+# 1) Undefined variables should return False rather than raising KeyError.
+#
+# 2) String values of 'False', '0', etc., should evaluate to False
+# (not just the empty string).
+#
+# #1 is solved by overriding __getitem__, and #2 is solved by using a
+# proxy class for values and overriding __nonzero__ on the proxy.
+# Everything else is just to (a) make proxies behave like normal
+# values otherwise, (b) make sure any dict operation returns a proxy
+# rather than a normal value, and (c) coerce values written to the
+# dict to be strings.
+
+
from convert import *
class SmartDict(dict):
+
class Proxy(str):
def __int__(self):
return int(to_integer(str(self)))
@@ -58,7 +75,7 @@ class SmartDict(dict):
def __getitem__(self, key):
- return self.Proxy(dict.__getitem__(self, key))
+ return self.Proxy(dict.get(self, key, 'False'))
def __setitem__(self, key, item):
dict.__setitem__(self, key, str(item))
@@ -77,9 +94,9 @@ class SmartDict(dict):
for key,value in dict.iteritems(self):
yield key, self.Proxy(value)
- def get(self, key, default=''):
+ def get(self, key, default='False'):
return self.Proxy(dict.get(self, key, str(default)))
- def setdefault(self, key, default=''):
+ def setdefault(self, key, default='False'):
return self.Proxy(dict.setdefault(self, key, str(default)))