У меня есть много больших коллекций объектов, которые необходимо фильтровать. Мне нужно, чтобы фильтры были гибкими и определяемыми пользователем.Фильтры, определяемые пользователем
Hard закодированы, это может выглядеть примерно так:
selected = set()
for o in objects:
if o.someproperty == 'ab':
selected.add(o)
if o.a == 'a' and 'something' in o.b:
selected.add(o)
Но мне нужно что-то я могу хранить в БД.
Я видел что-то, ссылающееся на это шаблон Criteria (или Filter) http://www.tutorialspoint.com/design_pattern/filter_pattern.htm, но я не могу найти много информации об этом.
Я хотел бы, чтобы правила были гибкими и сериализуемыми в простом формате.
Может быть выше, может выглядеть примерно так:
someproperty == 'ab'
a == 'a', 'something' in b
С каждой строкой правила является различным набором вещей, которые необходимо удовлетворить. Если какая-либо строка в наборе правил совпадает, объект включается. Но должна ли логическая логика быть наоборот (с and
между линиями и or
внутри них)? Оказывает ли это гибкость для обработки различных отрицаний? Как бы я его разобрал?
Какие простые подходы к этой проблеме?
Пару моего примера использует
# example 1
for o in objects:
if o.width < 1 and o.height < 1:
selected.add(o)
# example 2
for o in objects:
if o.type == 'i' or o.type == 't':
continue
if not o.color:
selected.add(o)
continue
if o.color == 'ffffff':
selected.add(o)
continue
if o.color == '000000':
continue
grey = (o.color[1:3] == o.color[3:5] and o.color[1:3] == o.color[5:7])
if grey:
selected.add(o)
ОЧЕНЬ простой способ - использовать 'eval', но делать это только в том случае, если вы хотите, чтобы ваш код ужасно нарушался. – muddyfish
Это то, что я рассматриваю, но пока не слишком глубоко задумался. Я считаю, что вы можете контролировать контекст для 'eval'. –
Вы можете сломать pythin даже с контролируемым 'eval' – muddyfish