Bob Ippolito (@etrepum) on Haskell, Python, Erlang, JavaScript, etc.
«

Abusing __getitem__ is fun

»
class SliceAbuser(object):
    def __init__(self, value):
        self.value = value
        self.items = []

    def __getitem__(self, items):
        if not isinstance(items, tuple):
            items = items,
        append = self.items.append
        for item in items:
            append((item.start, item.stop))
        return self

It doesn't look like much, right? Well, this hack basically allows you to use dict syntax on a __getitem__! Check this out:

s = SliceAbuser
resource, index, help, style, more, moreindex = 'resource', 'index', 'help', 'style', 'more', 'moreindex'
o = s(resource)[
    'index.html': s(index),
    'help.html': s(help),
    'style.css': s(style),
    'more': s(more)[
        'index.html': s(moreindex),
    ],
]

Yeah, it's a whole sitemap in Python syntax. Instead of strings, pretend that resource, index, etc. are all whatever kind of Resource objects your web framework uses (I'm thinking in Twisted). Don't believe me? Look at this:

def printSiteMap(obj, parents = ()):
    print '    ' * len(parents), '/'.join(parents), '->', obj.value
    for key, value in obj.items:
        printSiteMap(value, parents+(key,))
printSiteMap(o)
-> resource
   index.html -> index
   help.html -> help
   style.css -> style
   more -> more
       more/index.html -> moreindex
blog comments powered by Disqus