为SQLAlchemy Declarative Base重写__cmp __,__ eq__和__hash__

时间:2010-08-10 20:33:37

标签: python sqlalchemy

我想覆盖__cmp____eq____hash__,以便我可以对SQLAlchemy Declarative Base模型进行设置操作。这是否会导致与声明式基础实现发生冲突?

2 个答案:

答案 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)

没有。它会工作得很好。