我有一些谓词,例如:
is_divisible_by_13 = lambda i: i % 13 == 0
is_palindrome = lambda x: str(x) == str(x)[::-1]
并希望在逻辑上将它们组合为:
filter(lambda x: is_divisible_by_13(x) and is_palindrome(x), range(1000,10000))
现在的问题是:这样的组合可以写成无点风格,例如:
filter(is_divisible_by_13 and is_palindrome, range(1000,10000))
这当然不是预期的效果,因为 lambda 函数的真值是True
并且是短路运算符。我想出的最接近的事情是定义一个类,它是一个简单的谓词容器,它实现并具有方法并组合谓词。的定义如下:and
or
P
__call__()
and_()
or_()
P
import copy
class P(object):
def __init__(self, predicate):
self.pred = predicate
def __call__(self, obj):
return self.pred(obj)
def __copy_pred(self):
return copy.copy(self.pred)
def and_(self, predicate):
pred = self.__copy_pred()
self.pred = lambda x: pred(x) and predicate(x)
return self
def or_(self, predicate):
pred = self.__copy_pred()
self.pred = lambda x: pred(x) or predicate(x)
return self
现在P
我可以创建一个新的谓词,它是这样的谓词组合:
P(is_divisible_by_13).and_(is_palindrome)
相当于上面的 lambda 函数。这更接近我想要的,但它也不是无点的(这些点现在是谓词本身而不是它们的参数)。现在第二个问题是:有没有更好或更短的方法(可能没有括号和点)在 Python 中组合谓词,而不是使用类似P
和不使用 (lambda) 函数的类?