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

mau*_*ung 10 python sqlalchemy

我要重写__cmp__,__eq____hash__这样我就可以在SQLAlchemy的声明基本型号做的一组操作.这是否会导致与声明式基本实现发生冲突?

小智 5

也许,取决于比较功能的实现。

使用__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 []
Run Code Online (Sandbox Code Playgroud)

original not in (NEVER_SET, PASSIVE_NO_RESULT, None)如果比较不首先检查类型的相等性,或者比较中使用的字段是否存在,则该行可能会引发错误

作为解决方案,您应该考虑不同的类型。

还应避免重写,__cmp__而应使用丰富的比较运算符


nos*_*klo 2

不。它会工作得很好。

  • 你能引用任何 SQLAlchemy 文档来表明这没问题吗? (4认同)