我想覆盖__cmp__
,__eq__
和__hash__
,以便我可以对SQLAlchemy Declarative Base模型进行设置操作。这是否会导致与声明式基础实现发生冲突?
答案 0 :(得分:4)
可能,取决于比较函数的实现。
使用__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__
并使用rich comparison operators instead。
答案 1 :(得分:3)
没有。它会工作得很好。