Переопределение __cmp__, __eq__ и __hash__ для декларативной базы SQLAlchemy - PullRequest
9 голосов
/ 11 августа 2010

Я хочу переопределить __cmp__, __eq__ и __hash__, чтобы я мог выполнять операции над множествами в декларативной базовой модели SQLAlchemy. Приведет ли это к каким-либо конфликтам с декларативной базовой реализацией?

Ответы [ 2 ]

4 голосов
/ 16 марта 2016

Возможно, в зависимости от реализации функции сравнения.

При использовании __eq__ или __cmp__ необходимо соблюдать осторожность при сравнении с объектом other, поскольку SQLAlchemy может сравнивать ваш объект с некоторыми символами.такие как NEVER_SET, которые не имеют тот же тип.Взгляните на этот метод SQLAlchemy:

def get_all_pending(self, state, dict_):
    if self.key in dict_:
        current = dict_[self.key]
        if current is not None:
            ret = [(instance_state(current), current)]
        else:
            ret = [(None, None)]

        if self.key in state.committed_state:
            original = state.committed_state[self.key]
            if original not in (NEVER_SET, PASSIVE_NO_RESULT, None) and \
                original is not current:

                ret.append((instance_state(original), original))
        return ret
    else:
        return []

Строка original not in (NEVER_SET, PASSIVE_NO_RESULT, None) может вызвать ошибку, если сравнение не проверяет сначала равенство типов или существование полей, которые являютсяиспользуется для сравнения

В качестве решения следует учитывать различные типы.

Также следует избегать переопределения __cmp__ и использовать операторы сравнения вместо .

3 голосов
/ 11 августа 2010

нет.Это будет отлично работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...