我有一组筛选器对象,它们继承Filter
基类的属性
class Filter():
def __init__(self):
self.filterList = []
def __add__(self,f):
self.filterList += f.filterList
def match(self, entry):
for f in self.filterList:
if not f(entry):
return False
return True
class thisFilter(Filter):
def __init__(self, args):
super().__init__()
....
def thisFilterFunc(entry)->bool:
return True
self.filterList.append(thisFilterFunc)
此筛选器类由各种函数用于筛选条目
def myfunc(myfilter, arg1, ...):
...
for entry in entries:
if myfilter.match(entry):
... do something
通过添加以下过滤器的实例,可以添加多个过滤器(逻辑和):
bigFilter = filter1 + filter2 + ...
这一切都很好地结合在一起,但我想用一种方法来概括它,以处理更复杂的逻辑约束,例如
bigFilter = (filter1 and filter2) or (filter3 and not filter4)
通过覆盖类的__bool__
而不是使用__add__
感觉应该可以做到这一点,但类的布尔值仅在给定条目中已知,而在过滤器组装期间不知道
有什么办法可以做到这一点吗?或者有没有更像Python的方法
谢谢@njzk2提供的解决方案。在我的代码中,我使用了
|
和&
。为了向后兼容,我还保留了.match()
而不是使用__call__()
,并再次添加了__add__
我会选择这样的方式:
然后您可以创建过滤器,并将其用作
(filterA + ~filterB) * filterC
您可能希望用泛型类型替换该
Any
,以便您的过滤器知道它在处理什么相关问题 更多 >
编程相关推荐