aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'netlib/utils.py')
-rw-r--r--netlib/utils.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/netlib/utils.py b/netlib/utils.py
index 44bed43a..905d948f 100644
--- a/netlib/utils.py
+++ b/netlib/utils.py
@@ -65,3 +65,29 @@ def getbit(byte, offset):
mask = 1 << offset
if byte & mask:
return True
+
+
+class BiDi:
+ """
+ A wee utility class for keeping bi-directional mappings, like field
+ constants in protocols:
+
+ CONST = BiDi(a=1, b=2)
+ assert CONST.a == 1
+ assert CONST[1] == "a"
+ """
+ def __init__(self, **kwargs):
+ self.names = kwargs
+ self.values = {}
+ for k, v in kwargs.items():
+ self.values[v] = k
+ if len(self.names) != len(self.values):
+ raise ValueError("Duplicate values not allowed.")
+
+ def __getattr__(self, k):
+ if k in self.names:
+ return self.names[k]
+ raise AttributeError("No such attribute: %s", k)
+
+ def __getitem__(self, k):
+ return self.values[k]