You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.8 KiB
63 lines
1.8 KiB
4 months ago
|
|
||
|
class LookupDictionary(dict):
|
||
|
"""
|
||
|
a dictionary which can lookup value by key, or keys by value
|
||
|
"""
|
||
|
|
||
|
def __init__(self, items=[]):
|
||
|
"""items can be a list of pair_lists or a dictionary"""
|
||
|
dict.__init__(self, items)
|
||
|
|
||
|
def get_keys_for_value(self, value, fail_value=None):
|
||
|
"""find the key(s) as a list given a value"""
|
||
|
list_result = [item[0] for item in self.items() if item[1] == value]
|
||
|
if len(list_result) > 0:
|
||
|
return list_result
|
||
|
return fail_value
|
||
|
|
||
|
def get_first_key_for_value(self, value, fail_value=None):
|
||
|
"""return the first key of this dictionary given the value"""
|
||
|
list_result = [item[0] for item in self.items() if item[1] == value]
|
||
|
if len(list_result) > 0:
|
||
|
return list_result[0]
|
||
|
return fail_value
|
||
|
|
||
|
def get_value(self, key, fail_value=None):
|
||
|
"""find the value given a key"""
|
||
|
if key in self:
|
||
|
return self[key]
|
||
|
return fail_value
|
||
|
|
||
|
|
||
|
class Enum(LookupDictionary):
|
||
|
|
||
|
def __init__(self, initial_value=0, items=[]):
|
||
|
"""items can be a list of pair_lists or a dictionary"""
|
||
|
LookupDictionary.__init__(self, items)
|
||
|
self.value = initial_value
|
||
|
|
||
|
def set_value(self, v):
|
||
|
v_typename = typeof(v).__name__
|
||
|
if v_typename == 'str':
|
||
|
if str in self:
|
||
|
v = self[v]
|
||
|
else:
|
||
|
v = 0
|
||
|
else:
|
||
|
self.value = v
|
||
|
|
||
|
def get_enum_value(self):
|
||
|
return self.value
|
||
|
|
||
|
def get_enum_name(self):
|
||
|
return self.__str__()
|
||
|
|
||
|
def __str__(self):
|
||
|
s = self.get_first_key_for_value(self.value, None)
|
||
|
if s is None:
|
||
|
s = "%#8.8x" % self.value
|
||
|
return s
|
||
|
|
||
|
def __repr__(self):
|
||
|
return self.__str__()
|