2010-10-04 9 views
6

मैं इस तथ्य के आधार पर एक तर्क पर एक ऑपरेशन करना चाहता हूं कि यह एक नक्शा जैसी वस्तु या अनुक्रम जैसी वस्तु हो सकती है। मैं समझता हूं कि टाइप-जैसी जांच के लिए कोई रणनीति 100% विश्वसनीय नहीं होगी, लेकिन मैं एक मजबूत समाधान की तलाश में हूं।अनुक्रम और मैपिंग के बीच अंतर कैसे करें

इस answer के आधार पर, मुझे पता है कि यह निर्धारित करने के लिए कि कोई अनुक्रम है या नहीं और यह जांचने के बाद मैं यह जांच कर सकता हूं कि ऑब्जेक्ट मानचित्र है या नहीं।

def ismap(arg): 
    # How to implement this? 

def isseq(arg): 
    return hasattr(arg,"__iter__") 

def operation(arg): 
    if ismap(arg): 
     # Do something with a dict-like object 
    elif isseq(arg): 
     # Do something with a sequence-like object 
    else: 
     # Do something else 

क्योंकि एक दृश्य एक नक्शा जहां कुंजी पूर्णांक हैं के रूप में देखा जा सकता है, मैं सिर्फ एक महत्वपूर्ण यह है कि एक पूर्णांक नहीं है खोजने की कोशिश करनी चाहिए? या शायद मैं स्ट्रिंग प्रतिनिधित्व देख सकता था? या ...?

अद्यतन

मैं SilentGhost के जवाब का चयन किया है, क्योंकि यह की तरह लग रहा सबसे "सही" एक है, लेकिन मेरी जरूरतों के लिए, यहाँ समाधान कार्यान्वयन के लिए मैं समाप्त हो गया है:

if hasattr(arg, 'keys') and hasattr(arg, '__getitem__'): 
    # Do something with a map 
elif hasattr(arg, '__iter__'): 
    # Do something with a sequence/iterable 
else: 
    # Do something else 

अनिवार्य रूप से, मैं एबीसी पर भरोसा नहीं करना चाहते हैं क्योंकि कई कस्टम वर्ग हैं जो अनुक्रमों और शब्दकोशों की तरह व्यवहार करते हैं लेकिन फिर भी यह अजगर संग्रह एबीसी (@Manoj टिप्पणी देखें) का विस्तार नहीं करते हैं। मैंने सोचा कि चाबियाँ विशेषता (किसी व्यक्ति द्वारा उसका जवाब हटा दिया गया है) मैपिंग के लिए पर्याप्त पर्याप्त जांच थी।

अनुक्रम और मैपिंग एबीसी का विस्तार करने वाले वर्ग इस समाधान के साथ भी काम करेंगे।

+0

क्यों नहीं बस की तरह कुछ अनुक्रम की कोशिश या तरह के नक्शे, और त्रुटियों के आधार पर, आप यह निर्धारित कर सकते हैं के रूप में यह इलाज के लिए क्या। – PyRulez

उत्तर

10
>>> from collections import Mapping, Sequence 
>>> isinstance('ac', Sequence) 
True 
>>> isinstance('ac', Mapping) 
False 
>>> isinstance({3:42}, Mapping) 
True 
>>> isinstance({3:42}, Sequence) 
False 

collections abstract base classes (ABCs)

+3

कस्टम कक्षाओं के बारे में कैसे? उदाहरण के लिए Django की 'QuerySet'? यह एक अनुक्रम की तरह व्यवहार करता है लेकिन 'इंस्टेंसेंस (a_queryset, अनुक्रम) 'रिटर्न' झूठा 'देता है। –

+1

@Manoj: उन्हें विरासत को ठीक करने की आवश्यकता हो सकती है? यह किस अर्थ में "अनुक्रम की तरह व्यवहार करता है"? – SilentGhost

+1

@ सिलेंटगोस्ट: हमम। तुम सही हो। मुझे लगता है कि डिजाइनरों को उचित प्रकार के उप-वर्ग द्वारा शुरू करना होगा यदि वे ऐसे परिचालनों की अपेक्षा करते हैं। –

1

अनुक्रमों में __add__ विधि है जो + ऑपरेटर लागू करती है। मानचित्र में उस विधि नहीं है, क्योंकि किसी मानचित्र में जोड़ने के लिए एक कुंजी और मान दोनों की आवश्यकता होती है, और + ऑपरेटर के पास केवल एक दाएं हाथ की तरफ होता है।

तो तुम कोशिश कर सकते हैं:

def ismap(arg): 
    return isseq(arg) and not hasattr(arg, "__add__")