Skip to content

Instantly share code, notes, and snippets.

@john-tornblom
Last active June 13, 2018 19:46
Show Gist options
  • Save john-tornblom/21eca04788c3980778039bf91866e7dd to your computer and use it in GitHub Desktop.
Save john-tornblom/21eca04788c3980778039bf91866e7dd to your computer and use it in GitHub Desktop.
class Order(object):
reverse = False
def __init__(self, attrs, reverse=False):
self.attrs = attrs
self.reverse = reverse
def __call__(self, l):
return sorted(l,
key=lambda el: [getattr(el, name) for name in self.attrs],
reverse=self.reverse)
def order_by(*args):
return Order(args)
def reverse_order_by(*args):
return Order(args, reverse=True)
class WhereEq(dict):
def __call__(self, l):
for item in l:
for name in self:
if getattr(item, name) != self.get(name):
break
else:
# fallthrough incase no break
yield item
def where_eq(**kwargs):
return WhereEq(kwargs)
def select_many(l, *set_modifiers):
for setmod in set_modifiers:
l = setmod(l)
return list(l)
#
# Example
#
class Cls(object):
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return 'Cls(name=%r, age=%r)' % (self.name, self.age)
l = [Cls('Kalle', 5), Cls('Anna', 5), Cls('Sven', 53)]
print select_many(l, order_by('name', 'age'), where_eq(age=5)) # [Cls(name='Anna', age=5), Cls(name='Kalle', age=5)]
print select_many(l, where_eq(age=5), reverse_order_by('name', 'age')) # [Cls(name='Kalle', age=5), Cls(name='Anna', age=5)]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment