मेरे प्रोग्राम के पायथन 3.1 कांटा में एक सुविधा पोर्ट करते समय मुझे एक अजीब बग था। मैंने इसे निम्नलिखित परिकल्पनाओं तक सीमित कर दिया:'__eq__` को परिभाषित करने वाले प्रकार अचूक हैं?
पायथन 2.x के विपरीत, पायथन 3.x में यदि किसी ऑब्जेक्ट में __eq__
विधि है तो यह स्वचालित रूप से अप्राप्य है।
क्या यह सच है?
यहाँ क्या अजगर 3.1 में क्या होता है:
>>> class O(object):
... def __eq__(self, other):
... return 'whatever'
...
>>> o = O()
>>> d = {o: 0}
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
d = {o: 0}
TypeError: unhashable type: 'O'
अनुवर्ती सवाल है, कैसे मैं अपने निजी समस्या को हल करते हैं? मेरे पास एक ऑब्जेक्ट ChangeTracker
है जो WeakKeyDictionary
स्टोर करता है जो कई ऑब्जेक्ट्स को इंगित करता है, जो अतीत में एक निश्चित समय बिंदु पर उनके अचार डंप के प्रत्येक मूल्य के लिए देता है। जब भी कोई मौजूदा ऑब्जेक्ट चेक किया जाता है, तो परिवर्तन ट्रैकर कहता है कि उसका नया अचार अपने पुराने के समान है, इसलिए कह रहा है कि इस दौरान ऑब्जेक्ट बदल गया है या नहीं। समस्या यह है कि अब मैं यह भी जांच नहीं सकता कि दी गई वस्तु लाइब्रेरी में है या नहीं, क्योंकि यह वस्तु को अचूक होने के बारे में अपवाद उठाती है। (क्योंकि इसमें __eq__
विधि है।) मैं इसके आसपास कैसे काम कर सकता हूं?
यदि आप '__hash__' विधि प्रदान करते हैं तो क्या होता है? – ndim