Comments 9
Спасибо, до такого использования eq и им подобных сам бы не додумался…. Максимум, это просто реагировать на сравнение двух экземпляров классов между собой, выделяя для этого какой-то параметр класса.
Как я понимаю, конструкция filtrable_l.filter(filtrable_l >= 2).filter(filtrable_l < 6) реализует AND на все условия, а если мы хотим OR реализовать?
Логические операции можно так же сделать через дандеры __or__
, __and__
, __invert__
. Посмотрите, например, как в джанге устроены Q-объекты https://github.com/django/django/blob/599f3e2cda50ab084915ffd08edb5ad6cad61415/django/db/models/query_utils.py#L35
Вариантов как всегда 2, либо заколхозить метод orFilter(), либо, как коллега выше предлагал, переопределить еще парочку дандер-методов. Тут уж как вам по дизайну ближе)
Есть ещё третий способ, реализованный в pandas query - передавать строку данных со специальными символами.
Кстати, метод Filter(), реализующий AND, просто применяет условия к списку одно за одним, каждый раз отсекая лишнее.
Метод orFilter(), чтобы реализовать OR, должен сначала запомнить все условия для OR, относящиеся к одному списку, и только потом применить их одновременно, что довольно нетривиальная задача!
Насколько знаю, если __ eq__() был переопределён, то и __hash__() тоже надо переопределять. Или интсансы станут нехешируемы.
assert при -O стирается. Зачем такое советовать?
Python. Выражения в методах и индексаторах