重写SQLAlchemy Declarative Base的__cmp__、__eq__和__hash__方法

12

我想覆盖__cmp____eq____hash__方法,以便在SQLAlchemy Declarative Base模型上执行集合操作。这样做会与Declarative Base实现产生任何冲突吗?

2个回答

7

也许会根据比较函数的实现而定。

当使用__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 []
原始不在(NEVER_SET,PASSIVE_NO_RESULT,None)这行代码可能会引发错误,如果比较没有首先检查类型的相等性或比较中使用的字段的存在性。
解决方法是考虑不同类型。此外,请避免覆盖 __cmp__ 并改用富比较运算符

好的发现!这很重要。 - Matthew Moisen

2

不会出问题,它能正常工作。


4
你能引用任何 SQLAlchemy 的文档表明这样做是可以的吗? - DuneBug
1
@DuneBug 我看不出来会有什么问题。Sqlalchemy本身并不会覆盖那些专门用于声明基础的特殊方法。 - nosklo
1
如果SQLAlchemy像@ovidiu提到的那样使用__eq__,那可能会成为一个问题。 - Matthew Moisen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接