Pull to refresh

Comments 9

Спасибо, до такого использования eq и им подобных сам бы не додумался…. Максимум, это просто реагировать на сравнение двух экземпляров классов между собой, выделяя для этого какой-то параметр класса.

Как я понимаю, конструкция filtrable_l.filter(filtrable_l >= 2).filter(filtrable_l < 6) реализует AND на все условия, а если мы хотим OR реализовать?

Вариантов как всегда 2, либо заколхозить метод orFilter(), либо, как коллега выше предлагал, переопределить еще парочку дандер-методов. Тут уж как вам по дизайну ближе)

Есть ещё третий способ, реализованный в pandas query - передавать строку данных со специальными символами.

Кстати, метод Filter(), реализующий AND, просто применяет условия к списку одно за одним, каждый раз отсекая лишнее.

Метод orFilter(), чтобы реализовать OR, должен сначала запомнить все условия для OR, относящиеся к одному списку, и только потом применить их одновременно, что довольно нетривиальная задача!

По идее, если уж делать полный вариант, OR и AND можно комбинировать, и надо что-то вроде expression tree построить. Кстати в SqlAlchemy в filter передается инстанс класса BinaryExpression.

Насколько знаю, если __ eq__() был переопределён, то и __hash__() тоже надо переопределять. Или интсансы станут нехешируемы.

Кажется в SQLAlchemy используются гибридные методы, по-разному работающие для класса и объекта.

Sign up to leave a comment.