我有许多需要过滤的大型对象集合。我需要过滤器灵活且用户可定义。
硬编码,它可能看起来像:
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)
但是我需要能存储在数据库中的东西。
我看到有人提到这是标准(或过滤)模式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)