2013-11-04 5 views
8

मैं अजगर-स्पाइडरमोनकी का उपयोग कर रहा हूं, जो आंतरिक रूप से पीईएमएपिंग_Check का उपयोग करता है यह पहचानने के लिए कि क्या ग्लोबल के रूप में उपयोग किया जा रहा है (rt.new_context (वैश्विक) में) मैपिंग प्रोटोकॉल लागू करता है। (यह मूल रूप से एक शब्दकोश अजगर-Spidermonkey को पारित कर दिया है, ताकि जावास्क्रिप्ट अजगर चर पर सीमित पहुंच गया है।)पायथन में मैपिंग प्रोटोकॉल को सही तरीके से कार्यान्वित कैसे करें?

सरकारी परिभाषा मैं अजगर में मानचित्रण प्रोटोकॉल का मिल सकता है नहीं है, तो मैं करने के लिए परीक्षण और त्रुटि का उपयोग कर निर्धारित करें कि इसमें क्या है। क्या कोई आधिकारिक संदर्भ है?

उत्तर

14

collections.abc मॉड्यूल Mapping, Sequence जैसी चीजों के लिए इंटरफ़ेस को परिभाषित करता है, और इसी तरह।

उस मॉड्यूल में सार आधार वर्गों से विरासत प्राप्त करके, आपको कुछ विधियों के डिफ़ॉल्ट कार्यान्वयन मिलते हैं।

  • __contains__
  • :

    class MyMapping(collections.abc.Mapping): 
        def __getitem__(self, item) 
        def __iter__(self) 
        def __len__(self) 
    

    Mapping से विरासत आप 'निःशुल्क' dict की उपयोगी तरीकों के अधिकांश के कार्यान्वयन मिल जाएगा: तो एक Mapping, अपने वर्ग परिभाषा कुछ इस तरह दिखना चाहिए पर विचार किया जाएगा

  • keys
  • items
  • values
  • get
  • __eq__
  • __ne__

इन डिफ़ॉल्ट विधि कार्यान्वयन कस्टम डेटा संरचना के साथ अक्षम हैं, तो आप हमेशा उन्हें अपने खुद के संस्करणों के साथ ओवरराइड कर सकते हैं।


एक MutableMapping पर विचार किया जा करने के लिए, अपने वर्ग के इंटरफ़ेस इस तरह दिखना चाहिए:

class MyMutableMapping(collections.abc.MutableMapping): 
    def __getitem__(self, item) 
    def __setitem__(self, item) 
    def __delitem__(self, item) 
    def __iter__(self) 
    def __len__(self) 

MutableMapping से विरासत हो जाता है आप 'निःशुल्क' Mapping के तरीकों के सभी की परिभाषा, प्लस:

  • pop
  • popitem
  • clear
  • update
  • setdefault

आप स्क्रैच से 'अपने खुद के रोलिंग' कर रहे हैं और एक सार आधार वर्ग का उपयोग नहीं करना चाहते हैं, तो आप शायद परिभाषित करने के लिए प्रयास करना चाहिए उपरोक्त विधियों के सभी, यदि आप चाहते हैं कि आपकी कक्षा dict के लिए सख्ती से Liskov-substitutable हो।

+0

यह सही लगता है, धन्यवाद!काश वे उस पृष्ठ पर कहीं भी कीवर्ड मैपिंग प्रोटोकॉल का इस्तेमाल किया था। – Chris

+1

यदि आप जानते हैं कि आपने अपने विशिष्ट उपयोग के लिए पर्याप्त मैपिंग प्रोटोकॉल लागू किया है, लेकिन नियमित मैपिंग चेक पास करने के लिए पर्याप्त नहीं है, तो आप 'collections.Mapping.register (MyMappingLikeClass) 'का भी उपयोग कर सकते हैं। – Blckknght

+0

@ ब्लैकनघट: "नियमित मैपिंग चेक" क्या हैं? –

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

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