Идиоматичные фильтры

Как я писал в предыдущих постах, недавно, с 1 января 2020 года, я стал писать на Python. Я успел уже узнать что такое SQLAlchemy, и у меня немного порвало шаблон когда я увидел код такого вида:

def tag_search(slug):
tag = Tag.query.filter(Tag.slug == slug).first_or_404()

После других языков (например PHP, JavaScript, etc…) кажется что тут ошибка, ведь по сути мы передаем в функцию filter результат сравнения, который будет Bool. Но нет… Мы передаем объект, как результат работы операторов сравнения. И эта особенность Python меня очень порадовала.

Дабы проверить эту гипотезу, я немного поразбирался с перегрузкой операторов и тут меня осенила одна идея. А ведь можно сделать класс для замены лямбд, передаваемых в функции фильтрации.

Допустим есть такой список:

a = [1, -4, 6, 8, -10, 0, 2, 4, -3, -12, 0]

Я хочу его отфильтровать, получив все числа больше нуля. Я бы написал такой код:

b = list(filter(lambda x: x > 0, a))

И, в принципе, так учат писать учебники и разные уроки по языку Python. Но, узнав про элегантную перегрузку операторов, благодаря SQLAlchemy, я подумал, а что если создать такой класс:

class X:
def __ne__(self, obj): return lambda x: x != obj
def __eq__(self, obj): return lambda x: x == obj
def __gt__(self, obj): return lambda x: x > obj
def __ge__(self, obj): return lambda x: x >= obj
def __lt__(self, obj): return lambda x: x < obj
def __le__(self, obj): return lambda x: x <= obj

И теперь мы можем писать так:

b = list(filter(x > 0, a))

Мелочь, но как же идиоматично выглядит такая запись (мое имхо). Мы просто говорим что фильтруем список где x-овый элемент больше нуля. Конечно это может порвать шаблон, особенно если за плечами очень большой опыт разработки на других языках, где такое невозможно.

И я бы подумал что это очень плохой тон разработки на Python, но, господа, мне хочется тыкнуть в лицо библиотекой SQLAlchemy, которая пользуется популярностью и сказать, а почему им можно? 🙂

Если вы знаете еще подобные примеры — напишите в комментариях пожалуйста.