Skip to content

Instantly share code, notes, and snippets.

@jcdyer
Created April 13, 2016 15:37
Show Gist options
  • Save jcdyer/02bd83cd89db89151c282970ea2daed9 to your computer and use it in GitHub Desktop.
Save jcdyer/02bd83cd89db89151c282970ea2daed9 to your computer and use it in GitHub Desktop.
class PathMap(object):
sep = u'.'
def __init__(self):
self._store = {}
def __setitem__(self, key, value):
segments = key.rstrip(self.sep).split(self.sep)
next_ = self._store
for segment in segments:
if segment not in next_:
next_[segment] = {}
next_ = next_[segment]
next_['__value__'] = value
def __getitem__(self, key):
notfound_sentinel = object()
value = notfound_sentinel
segments = key.rstrip(self.sep).split(self.sep)
next_ = self._store
for segment in segments:
if '__value__' in next_:
value = next_['__value__']
if segment not in next_:
break
next_ = next_[segment]
if value is notfound_sentinel:
raise KeyError
else:
return value
def test_create():
pm = PathMap()
pm['a.b.c.'] = 'alphabet'
pm['this.is.one.'] = ()
pm['this.is.'] = []
return pm
def test_first():
pm = test_create()
assert pm['a.b.c.d.e'] == 'alphabet'
def test_2():
pm = test_create()
assert pm['this.is.one.tuple'] == ()
def test_3():
pm = test_create()
assert pm['this.is.a.list'] == []
def test_4():
pm = test_create()
try:
pm['a.b']
except KeyError:
pass
else:
assert False, "Should have raised a key error"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment