mirror of
https://github.com/9001/copyparty.git
synced 2025-08-19 09:52:21 -06:00
42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
# coding: utf-8
|
|
|
|
import types
|
|
|
|
|
|
class BimapError(Exception):
|
|
pass
|
|
|
|
|
|
class Bimap(object):
|
|
def __init__(self, name, forward, error=AttributeError):
|
|
self.name = name
|
|
self.error = error
|
|
self.forward = forward.copy()
|
|
self.reverse = dict([(v, k) for (k, v) in list(forward.items())])
|
|
|
|
def get(self, k, default=None):
|
|
try:
|
|
return self.forward[k]
|
|
except KeyError:
|
|
return default or str(k)
|
|
|
|
def __getitem__(self, k):
|
|
try:
|
|
return self.forward[k]
|
|
except KeyError:
|
|
if isinstance(self.error, types.FunctionType):
|
|
return self.error(self.name, k, True)
|
|
else:
|
|
raise self.error("%s: Invalid forward lookup: [%s]" % (self.name, k))
|
|
|
|
def __getattr__(self, k):
|
|
try:
|
|
if k == "__wrapped__":
|
|
raise AttributeError()
|
|
return self.reverse[k]
|
|
except KeyError:
|
|
if isinstance(self.error, types.FunctionType):
|
|
return self.error(self.name, k, False)
|
|
else:
|
|
raise self.error("%s: Invalid reverse lookup: [%s]" % (self.name, k))
|