Возможно, в зависимости от реализации функции сравнения.
При использовании __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__
и использовать операторы сравнения вместо .