2010-08-14 5 views
18

मैं उप-वर्ग को UserDict.DictMixin से प्राप्त करने का प्रयास कर रहा हूं जो गैर-हैशबल कुंजी का समर्थन करता है। प्रदर्शन चिंता नहीं है। दुर्भाग्य से, पाइथन subclass से एक dict वस्तु बनाने की कोशिश कर DictMixin में कुछ कार्यों को लागू करता है। मैं इन्हें स्वयं लागू कर सकता हूं, लेकिन मैं __cmp__ पर फंस गया हूं।क्या कोई विवरण है कि __cmp__ पायथन 2 में dict ऑब्जेक्ट्स के लिए कैसे काम करता है?

मुझे कक्षा वर्ग के लिए अंतर्निहित __cmp__ द्वारा उपयोग किए गए तर्क का एक संक्षिप्त वर्णन नहीं मिल रहा है।

उत्तर

26

तो आप कैसे शब्दकोशों काम करता है की तुलना में पूछ रहे हैं, यह इस प्रकार है:

  • dicts ए और बी की तुलना करने के लिए, पहली बार अपने लंबाई की तुलना करें। यदि वे असमान हैं, तो सीएमपी (लेन) (लेन) (लेन) वापस लौटें)।
  • अगला, ए में मुख्य एडिफ़ खोजें जो कि सबसे छोटी कुंजी है जिसके लिए adiff not in B or A[adiff] != B[adiff] है। (यदि ऐसी कोई कुंजी नहीं है, तो डिक्ट्स बराबर हैं।)
  • बी में सबसे छोटी कुंजी बीडीएफ भी खोजें जिसके लिए bdiff not in A or A[bdiff] != B[bdiff] है।
  • यदि adiff! = Bdiff, तो cmp (adiff, bdiff) वापस करें। अन्य वापसी सीएमपी (ए [एडिफ], बी [बीडीएफ])।

छद्म कोड में:

def smallest_diff_key(A, B): 
    """return the smallest key adiff in A such that adiff not in B or A[adiff] != B[bdiff]""" 
    diff_keys = [k for k in A if k not in B or A[k] != B[k]] 
    return min(diff_keys) 

def dict_cmp(A, B): 
    if len(A) != len(B): 
     return cmp(len(A), len(B)) 
    try: 
     adiff = smallest_diff_key(A, B) 
    except ValueError: 
     # No difference. 
     return 0 
    bdiff = smallest_diff_key(B, A) 
    if adiff != bdiff: 
     return cmp(adiff, bdiff) 
    return cmp(A[adiff], b[bdiff]) 

यह dictobject.c में 2.6.3 कार्यान्वयन से अनुवाद किया है।

+0

कृपया धन्यवाद! – DannoHung

+1

क्या आप जानते थे कि 'dict_compare' (http://svn.python.org/projects/python/trunk/Objects/dictobject.c) के स्रोत को पढ़कर या क्या यह कहीं कहीं दस्तावेज है? – unutbu

+3

मैंने स्रोत पढ़ा। –

0

__cmp__here का कोई वर्णन नहीं है, लेकिन मुझे लगता है कि नोट करना महत्वपूर्ण बात यह है कि __cmp__ केवल प्रयोग किया जाता है अगर इस तरह के __lt__ और __eq__ के रूप में "अमीर तुलना" तरीकों, परिभाषित नहीं कर रहे हैं। इसके अलावा, Python3 में, __cmp__ भाषा से हटा दिया गया है। तो शायद __cmp__ पूरी तरह से eschew और बस __lt__ और __eq__ परिभाषित करें।

+0

हाँ, मैं बस इंटरफ़ेस मैच 2.4 dict (कार्य आवश्यकता) बनाने की कोशिश कर रहा हूं। मैं शायद बाद में इस कोड के 3.x पोर्ट पर पूरा करूँगा। – DannoHung

2

collections पैकेज से मैपिंग एबीसी का उपयोग करने का एक विकल्प है। यह 2.6 और ऊपर में उपलब्ध है। आप सिर्फ संग्रह से उत्तराधिकारी हैं। __getitem__, __contains__, और __iter__ विधियों को मानचित्रण और कार्यान्वित करें। आप सबकुछ मुफ्त में प्राप्त करते हैं।

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