Skip to content

Instantly share code, notes, and snippets.

@baldurthoremilsson
Created May 25, 2012 14:01
Show Gist options
  • Save baldurthoremilsson/2788307 to your computer and use it in GitHub Desktop.
Save baldurthoremilsson/2788307 to your computer and use it in GitHub Desktop.
LazyMapper
# -*- coding: utf-8 -*-
class LazyMapperItem(object):
def __init__(self, item, mapping):
self.__item = item
self.__mapping = mapping
def __getattr__(self, name):
try:
real_name = self.__mapping[name]
except KeyError:
real_name = name
return getattr(self.__item, real_name)
def __getitem__(self, key):
try:
real_key = self.__mapping[key]
except KeyError:
real_key = key
return self.__item[real_key]
class LazyMapper(object):
def __init__(self, iterable, mapping=None, **kwargs):
self.__iterable = iterable
self.__iterator = iter(iterable)
if mapping:
self.__mapping = mapping
else:
self.__mapping = kwargs
self.i = 0
def __iter__(self):
return self
def next(self):
return LazyMapperItem(self.__iterator.next(), self.__mapping)
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, key):
return getattr(self, key)
if __name__ == "__main__":
persons = []
persons.append(Person("Alice", 12))
persons.append(Person("Bob", 13))
mapping = {'nafn': 'name', 'aldur': 'age'}
l = LazyMapper(persons, nafn='name', aldur='age')
for p in l:
print p['nafn'], p.aldur
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment