2011-12-22 14 views
49

खोल dict उपवर्गीकरण बिना के लिए मानचित्रण के रूप में कार्य करता है, क्या एक वर्ग एक मानचित्रण विचार किया जाना इतना है कि यह साथ एक पद्धति के लिए पारित किया जा सकता की आवश्यकता होगी **अजगर वर्ग कि **

from abc import ABCMeta 

class uobj: 
    __metaclass__ = ABCMeta 

uobj.register(dict) 

def f(**k): return k 

o = uobj() 
f(**o) 

# outputs: f() argument after ** must be a mapping, not uobj 

कम से कम करने के लिए बिंदु जहां यह मैपिंग की अनुपलब्ध कार्यक्षमता की त्रुटियों को फेंकता है, इसलिए मैं कार्यान्वित करना शुरू कर सकता हूं।

मैंने कंटेनर प्रकारों को अनुकरण करने की समीक्षा की लेकिन जादू विधियों को परिभाषित करने का कोई प्रभाव नहीं पड़ा है, और एबीसीएमटा का उपयोग इसे ओवरराइड करने और इसे एक रजिस्टर के रूप में पंजीकृत करने के लिए सबक्लास के रूप में दावा मान्य करता है, लेकिन यह स्थिरता (ओ, dict) विफल रहता है। आदर्श रूप में, मैं एबीसीएमटा का भी उपयोग नहीं करना चाहता हूं।

उत्तर

66

__getitem__() और keys() तरीकों पर्याप्त होगा:

>>> class D: 
     def keys(self): 
      return ['a', 'b'] 
     def __getitem__(self, key): 
      return key.upper() 


>>> def f(**kwds): 
     print kwds 


>>> f(**D()) 
{'a': 'A', 'b': 'B'} 
19

आप एक मानचित्रण बनाने के लिए प्रयास कर रहे हैं - तो क्या तुम सच में collections.Mapping से विरासत चाहिए - न केवल एक समारोह को पारित करने के लिए आवश्यकताओं को पूरा। documentation में वर्णित है, तुम सिर्फ लागू करने की आवश्यकता:

__getitem__ 
__len__ 
__iter__ 

Mixin के आप के लिए सब कुछ को लागू करेगा: __contains__, keys, items, values, get, __eq__, और __ne__

+0

दायरे से परे, लेकिन प्रासंगिकता है और जानकारीपूर्ण है, धन्यवाद – dskinner

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

  • कोई संबंधित समस्या नहीं^_^