Last active
June 13, 2018 19:46
-
-
Save john-tornblom/21eca04788c3980778039bf91866e7dd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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