gpt4 book ai didi

python - 逻辑组合类实例

转载 作者:行者123 更新时间:2023-12-04 03:26:15 25 4
gpt4 key购买 nike

我有一组过滤器对象,它们继承了 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__但是该类的 bool 值仅在给定条目中是已知的,而不是在过滤器组装期间。
任何想法如何使这成为可能?或者是否有更pythonic的方式来做到这一点?

最佳答案

我会去做这样的事情:

class Filter:
def __init__(self, filter: Callable[[Any], bool]):
self.filter = filter

def __add__(self, added: Filter):
return OrFilter(self, added)

def __mul__(self, mult: Filter):
return AndFilter(self, mult)

def __invert__(self):
return Filter(lambda x: not self.filter(x))

def __call__(self, entry):
return self.filter(entry)

class AndFilter(Filter):
def __init__(self, left: Filter, right: Filter):
self.left = left
self.right = right

def __call__(self, entry):
return self.left(entry) and self.right(entry)

class OrFilter(Filter):
def __init__(self, left: Filter, right: Filter):
self.left = left
self.right = right

def __call__(self, entry):
return self.left(entry) or self.right(entry)
然后你可以创建过滤器,并将它们用作 (filterA + ~filterB) * filterC您可能想要替换那个 Any使用泛型类型,以便您的过滤器知道它在处理什么。

关于python - 逻辑组合类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67541366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com