Вы могли бы написать следующую функцию:
def conjoin(*fns):
def conjoined(x):
for fn in fns:
if not fn(x): return False
return True
return conjoined
Затем вы бы назвали ее так:
ifilter(conjoined(lambda x: x not in block_list, lambda x: x in accept_list),
read_records(filename))
И вы могли бы реализовать аналогичную функцию disjoin
для или -ing-функции вместе:
def disjoin(*fns):
def disjoined(x):
for fn in fns:
if fn(x): return True
return False
return disjoined
Возможно, есть более хороший способ их реализации, но нужно быть осторожным.Можно попробовать применить каждую функцию к x
и использовать all
или any
, но это нежелательно, поскольку для их использования потребуется оценка каждого предиката в аргументе.Представленное здесь решение удовлетворительно короткое замыкание.
Также, просто для удовольствия, давайте реализуем функцию invert
def invert(fn):
return lambda x: not fn(x)
Теперь у нас есть функционально завершенных набор функций, управляющих функциями, и может создавать любые логические операции из них:)