मैं एक ऑब्जेक्ट का उपयोग एक पायथन शब्दकोश में एक कुंजी के रूप में करने की कोशिश कर रहा हूं, लेकिन यह इस तरह से व्यवहार कर रहा है कि मैं काफी समझ नहीं पा रहा हूं।पाइथन शब्दकोशों में कुंजी के रूप में ऑब्जेक्ट्स
सबसे पहले मैं कुंजी के रूप में मेरी वस्तु के साथ एक शब्दकोश बनाने के लिए:
package_disseminators = {
ContentType("application", "zip", "http://other/property") : "one",
ContentType("application", "zip") : "two"
}
अब एक और उद्देश्य यह है कि एक चाबी है जो "एक ही" एक के रूप में है बनाएँ।
content_type = ContentType("application", "zip", "http://other/property")
मैं कस्टम ContentType वस्तु __eq__
और कस्टम __str__
तरीकों, जैसे कि __eq__
विधि __str__
मूल्यों तुलना दे दिया है।
अब, कुछ इंटरैक्टिव अजगर:
>>> for key in package_disseminators:
... if key == content_type:
... print "match"
... else:
... print "no match"
...
no match
match
>>> content_type in package_disseminators.keys()
True
ठीक है, तो यह मेरी वस्तु की तरह दिखता है निश्चित रूप से एक कुंजी के रूप में ठीक तरह से पहचान की जा रही है, तो:
>>> package_disseminators[content_type]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: (& (type="application/zip") (packaging="http://other/property"))
एर ... ठीक है? तो content_type package_disseminators.keys() सूची में है, लेकिन एक कुंजी नहीं है?
>>> package_disseminators.has_key(content_type)
False
स्पष्ट रूप से नहीं।
मुझे लगता है कि समानता निर्धारित करने के लिए पाइथन का उपयोग एक सूची में सीधे "इन" कथन के बीच भिन्न होता है और वास्तव में एक निर्देश में एक कुंजी देखता है, लेकिन मुझे नहीं पता कि कैसे। कोई सुझाव या अंतर्दृष्टि?
कुछ और स्पष्टीकरण: आपके ऑब्जेक्ट में 'ऑब्जेक्ट 'से विरासत में मिली' __hash__' विधि है। लेकिन डिफ़ॉल्ट कार्यान्वयन प्रत्येक उदाहरण के लिए एक अद्वितीय मूल्य देता है, इसलिए दो बराबर उदाहरणों में अलग-अलग हैंश नहीं होंगे जबतक कि आप बेहतर कार्यान्वयन न करें। 'has_key' हैश मानों की तुलना करता है, 'समानता के लिए चेक' में, यही कारण है कि 'has_key' आपके उदाहरणों में सफल होने पर विफल रहता है। –
हाय दोस्तों। बढ़िया, इसके लिए धन्यवाद, बहुत सराहना की! –