关于python:为SQLAlchemy Declarative Base重写__cmp __,__ eq__和__hash__

Overriding __cmp__, __eq__, and __hash__ for SQLAlchemy Declarative Base

我想覆盖__cmp____eq____hash__,这样我就可以在sqlAlchemy声明性基本模型上进行设置操作。这是否会导致与声明性基础实现发生冲突?


可能,这取决于比较函数的实现。

在使用__eq____cmp__other对象进行比较时必须小心,因为sqlAlchemy可能会将对象与某些符号(如NEVER_SET等)进行比较,这些符号的类型不同。看看这个sqlAlchemy方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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__并使用富比较运算符。


不,会很好的。