2010-08-10 17 views
8

के लिए __hash__ मैं ओवरराइड करने के लिए __cmp__, __eq__, और __hash__ तो मैं एक SQLAlchemy घोषणात्मक बेस मॉडल पर सेट कार्य कर सकते हैं चाहता हूँ। क्या यह घोषणात्मक आधार कार्यान्वयन के साथ कोई विवाद पैदा करेगा?अधिभावी __cmp__, __eq__, और SQLAlchemy घोषणात्मक बेस

उत्तर

4

संख्या। यह ठीक काम करेगा।

+0

बहुत बहुत धन्यवाद :) – mauzepeda

+1

क्या आप किसी भी एसक्यूएलकेमी दस्तावेज का हवाला देते हैं जो बताता है कि यह ठीक रहेगा? – DuneBug

+1

@DuneBug मैं नहीं देख सकता कि यह एक समस्या क्यों होगी। स्क्लेल्चेमी स्वयं घोषणात्मक आधार के लिए उन विशेष तरीकों को ओवरराइड नहीं करता है। – nosklo

2

शायद तुलनात्मक कार्यान्वयन कार्यान्वयन के आधार पर।

आप जब other वस्तु के साथ तुलना करने के लिए __eq__ या __cmp__ का उपयोग कर, क्योंकि SQLAlchemy ऐसे NEVER_SET के रूप में कुछ प्रतीक हैं, जो एक ही प्रकार की जरूरत नहीं है के साथ अपने वस्तु की तुलना कर सकते हैं सावधान रहना होगा।

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) लाइन है कि तुलना में किया जाता है क्षेत्रों के अस्तित्व के लिए करता है, तो तुलना पहले प्रकार की समानता की जांच नहीं करता एक त्रुटि उठाना, या हो सकता है: इस SQLAlchemy विधि पर एक नजर डालें

एक समाधान के रूप में, आपको अलग-अलग प्रकार को खाते में लेना चाहिए।

__cmp__ ओवरराइड करने से बचें और rich comparison operators instead का उपयोग करें।

+0

अच्छा पकड़ो! यह महत्वपूर्ण है। –

संबंधित मुद्दे