2016-08-19 8 views
9

टुकड़ा करने की क्रिया जब टुकड़ा करने की क्रिया के साथ प्रयोग करने के लिए बढ़ाया मैं अजगर 2.7 में एक अजीब व्यवहार देखा:अजगर बेसिक बनाम

class A: 
    def __getitem__(self, i): 
     print repr(i) 
a=A() 
a[:] #Prints slice(0, 9223372036854775807, None) 
a[::] #prints slice(None, None, None) 
a[:,:] #prints (slice(None, None, None), slice(None, None, None)) 

कोष्ठक में एक भी पेट का उपयोग कर, टुकड़ा वस्तु शुरू और एक विशाल पूर्णांक के रूप में के रूप में 0 है समाप्त। हालांकि, जब मैं एक से अधिक कॉलन का उपयोग करता हूं, तो शुरू और बंद नहीं होता है अगर निर्दिष्ट नहीं किया जाता है।

क्या यह व्यवहार गारंटीकृत है या कार्यान्वयन विशिष्ट है?

Documentation कहता है कि दूसरा और तीसरा मामला विस्तारित हो रहा है, जबकि पहला मामला नहीं है। हालांकि, मुझे बुनियादी और विस्तारित स्लाइसिंग के बीच अंतर का कोई स्पष्ट स्पष्टीकरण नहीं मिला।

क्या कोई अन्य "विशेष मामला" है जो मुझे पता होना चाहिए कि जब मैं __getitem__ ओवरराइड करता हूं और विस्तारित टुकड़ा स्वीकार करना चाहता हूं ??

+0

पायथन 2.7 के साथ, मुझे '2147483647' (2^31-1) मिलता है, इसलिए मूल्य निश्चित रूप से सिस्टम-विशिष्ट है। पायथन 3 के साथ, मुझे सभी मामलों में 'कोई नहीं' मिलता है। –

+3

यदि आप 'ए' को एक नई शैली कक्षा बनाते हैं तो यह 'कोई नहीं' में भी बदल जाता है। –

उत्तर

10

अजगर 2 [:] के लिए अभी भी __getslice__(self, i, j) (बहिष्कृत) कहता है और इस डिफ़ॉल्ट पैरामीटर के साथ कहा जाता है एक टुकड़ा slice(0, sys.maxsize, None) वापस जाने के लिए दर्ज है:

ध्यान दें कि लापता i या j टुकड़ा अभिव्यक्ति में शून्य से बदल दिया जाता या sys.maxsize ...

(जोर मेरा)। नई शैली कक्षाओं __getslice__() डिफ़ॉल्ट रूप से लागू नहीं है, इसलिए

यदि कोई __getslice__(), पाया जाता है एक टुकड़ा वस्तु बजाय बनाई गई है, और बदले __getitem__() को पारित कर दिया।

अजगर 3 __getslice__() का समर्थन नहीं करता, अब, बजाय इसे ऊपर टुकड़ा भाव सभी के लिए constructs a slice() वस्तु।

नोट:: और slice()None डिफ़ॉल्ट के रूप में है स्लाइसिंग निम्नलिखित तीन तरीकों के साथ विशेष रूप से किया जाता है। जैसे

a[1:2] = b

एक कॉल

a[slice(1, 2, None)] = b

और इसके आगे के लिए अनुवाद किया है। गायब टुकड़े आइटम हमेशा None के साथ भर जाते हैं।

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