2013-03-10 7 views
10

मैं एक ऐसे मुद्दे पर चल रहा हूं जहां मैं एक सेट में एक उदाहरण जोड़ रहा हूं और फिर बाद में यह देखने के लिए परीक्षण कर रहा हूं कि उस ऑब्जेक्ट में उस ऑब्जेक्ट मौजूद है या नहीं। मैंने __eq__() को ओवरराइड कर दिया है लेकिन इसे समावेशन परीक्षण के दौरान नहीं बुलाया जाता है। क्या मुझे इसके बजाय __hash__() ओवरराइड करना है? यदि हां, तो मैं __hash__() को कैसे कार्यान्वित करूं कि मुझे टुपल, सूची और शब्दकोश हैश की आवश्यकता है?सेट समावेशन परीक्षण के लिए __eq__ को कैसे कार्यान्वित करें?

class DummyObj(object): 

    def __init__(self, myTuple, myList, myDictionary=None): 
     self.myTuple = myTuple 
     self.myList = myList 
     self.myDictionary = myDictionary 

    def __eq__(self, other): 
     return self.myTuple == other.myTuple and \ 
      self.myList == other.myList and \ 
      self.myDictionary == other.myDictionary 

    def __ne__(self, other): 
     return not self.__eq__(other) 

if __name__ == '__main__': 

    list1 = [1, 2, 3] 
    t1 = (4, 5, 6) 
    d1 = { 7 : True, 8 : True, 9 : True } 
    p1 = DummyObj(t1, list1, d1) 

    mySet = set() 

    mySet.add(p1) 

    if p1 in mySet: 
     print "p1 in set" 
    else: 
     print "p1 not in set" 
+0

शायद आप हमारे लिए यूनिट परीक्षण लिख सकते हैं कि आप सफल होने की उम्मीद करते हैं? मुझे आपके कोड के साथ 'p1 में सेट' मिलता है। क्या मुझे कुछ और चाहिए? – hughdbrown

+2

हैशिंग म्यूटेबल ऑब्जेक्ट्स आमतौर पर एक अच्छा विचार नहीं है ... – mgilson

+0

देखें http://miki.python.org/moin/DictionaryKss क्यों @mgilson सही है। – delnan

उत्तर

10
documentation on sets से

:

सेट वर्गों शब्दकोशों का उपयोग करके लागू। तदनुसार, सेट तत्वों के लिए आवश्यकताएं कुंजी के लिए समान हैं; अर्थात्, तत्व __eq __() और __hash __() दोनों को परिभाषित करता है।

__hash__ function documentation एक साथ घटकों के हैंश को जोड़ता है। दूसरों के रूप में उल्लेख किया है, यह आम तौर पर एक अच्छा विचार परिवर्तनशील वस्तुओं हैश करने के लिए नहीं है, लेकिन अगर तुम सच में करने की जरूरत है, इस काम करता है:

class DummyObj(object): 

    ... 

    def __hash__(self): 
     return (hash(self.myTuple)^
       hash(tuple(self.myList))^
       hash(tuple(self.myDictionary.items()))) 

और अगर यह काम करता है देखने के लिए जाँच:

p1 = DummyObj(t1, list1, d1) 
p2 = DummyObj(t1, list1, d1) 
mySet = set() 
mySet.add(p1) 

print "p1 in set", p1 in mySet 
print "p2 in set", p2 in mySet 

यह प्रिंट :

$ python settest.py 
p1 in set True 
p2 in set True 
-3

खैर, मेरा अनुमान होगा __eq__ या __ne__ जब 'में' ऑपरेटर का उपयोग की वस्तुओं की तुलना अजगर से बुलाया नहीं हो सकता है। मैं सकारात्मक नहीं हूं कि विशिष्ट "समृद्ध तुलना" ऑपरेटर दस्तावेज को देखकर क्या होगा, लेकिन __cmp__ को ओवरराइड करना आपकी समस्या को हल करना चाहिए क्योंकि पाइथन डिफ़ॉल्ट रूप से ऑब्जेक्ट तुलना करने के लिए इसका उपयोग करता है यदि अधिक उपयुक्त "समृद्ध तुलना" ऑपरेटर लागू नहीं किया गया है ।

+1

आप गलत हैं। '__eq__' और' __ne__' ठीक काम करते हैं, समस्या (कस्टम, सही) हैश फ़ंक्शन की कमी है। – delnan

+0

अगर आप अनुमान लगा रहे हैं तो आप जवाब क्यों देंगे? – Alan

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