Loading ccnode/utils.py +82 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,88 @@ from threading import Lock def enum(*sequential, **named): ''' ''' enums = dict(zip(sequential, range(len(sequential))), **named) return type('Enum', (), enums) class Enum(dict): ''' Usage example: $ states = Enum(SLEEPING, CONNECTED="Conn", DISCONNECTED="Disco") $ print states.CONNECTED 1 $ states.SLEEPING 0 $ states.CONNECTED_str "Conn" $ states.SLEEPING_str None $ 0 in states True $ 10 in states False $ s = "Conn" $ if s in states: $ val = states[s] ''' def __init__(self, *named, **valued): ''' ''' # FIXME not memory optimal structures self._items_map = {} self._items_rmap = {} self._items_val = [] toks = [(name, None) for name in named] toks.extend([i for i in valued.iteritems()]) for key, tok in enumerate(toks): self._items_map[tok[0]] = key self._items_rmap[key] = tok[0] self._items_val.append(tok[1]) def __contains__(self, item): ''' ''' if isinstance(item, int): return item in self._items_rmap else: return item in self._items_val def __getitem__(self, key): ''' ''' if isinstance(key, int): return self._items_val[key] else: for idx, val in enumerate(self._items_val): if val == key: return idx raise IndexError('object not found in enum') def __getattr__(self, name): ''' ''' if name in self._items_map: return self._items_map[name] else: if name[-4:] == '_str': n = name[:3] if n in self._items_map: return self._items_val[self._items_map[n]] raise AttributeError('not an enum member') def get(self, key, default=None): ''' ''' try: return self[key] except IndexError as err: return default class RWLock(object): ''' ''' Loading Loading
ccnode/utils.py +82 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,88 @@ from threading import Lock def enum(*sequential, **named): ''' ''' enums = dict(zip(sequential, range(len(sequential))), **named) return type('Enum', (), enums) class Enum(dict): ''' Usage example: $ states = Enum(SLEEPING, CONNECTED="Conn", DISCONNECTED="Disco") $ print states.CONNECTED 1 $ states.SLEEPING 0 $ states.CONNECTED_str "Conn" $ states.SLEEPING_str None $ 0 in states True $ 10 in states False $ s = "Conn" $ if s in states: $ val = states[s] ''' def __init__(self, *named, **valued): ''' ''' # FIXME not memory optimal structures self._items_map = {} self._items_rmap = {} self._items_val = [] toks = [(name, None) for name in named] toks.extend([i for i in valued.iteritems()]) for key, tok in enumerate(toks): self._items_map[tok[0]] = key self._items_rmap[key] = tok[0] self._items_val.append(tok[1]) def __contains__(self, item): ''' ''' if isinstance(item, int): return item in self._items_rmap else: return item in self._items_val def __getitem__(self, key): ''' ''' if isinstance(key, int): return self._items_val[key] else: for idx, val in enumerate(self._items_val): if val == key: return idx raise IndexError('object not found in enum') def __getattr__(self, name): ''' ''' if name in self._items_map: return self._items_map[name] else: if name[-4:] == '_str': n = name[:3] if n in self._items_map: return self._items_val[self._items_map[n]] raise AttributeError('not an enum member') def get(self, key, default=None): ''' ''' try: return self[key] except IndexError as err: return default class RWLock(object): ''' ''' Loading