2009-11-06 2 views
18

मैं अपने मैट्रिक्स वर्ग पर__getitem__ पर एक से अधिक तर्क का उपयोग करना संभव है?

__getitem__(self, x, y): 

उपयोग करने के लिए कोशिश कर रहा हूँ, लेकिन यह मेरे लिए (मैं अभी भी नहीं जानता कि अजगर का उपयोग करने के बहुत अच्छी तरह से) काम नहीं करता है लगता है। मैं इसे इस तरह फोन कर रहा हूँ:

print matrix[0,0] 

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

उत्तर

34

__getitem__ केवल एक तर्क (स्वयं के अलावा) स्वीकार करता है, इसलिए आप एक ट्यूपल पास करते हैं।

आप ऐसा कर सकते हैं:

class matrix: 
    def __getitem__(self, pos): 
     x,y = pos 
     return "fetching %s, %s" % (x, y) 

m = matrix() 
print m[1,2] 

आउटपुट

fetching 1, 2 

अधिक जानकारी के लिए http://docs.python.org/reference/datamodel.html#object.getitem देखें

3

नहीं, __getitem__ सिर्फ एक तर्क लेता है (self के अतिरिक्त)। matrix[0, 0] के मामले में, तर्क tuple (0, 0) है।

21

दरअसल, जब आप bla[x,y] निष्पादित, आप type(bla).__getitem__(bla, (x, y)) कॉल कर रहे हैं - अजगर स्वचालित रूप से रूपों आपके लिए tuple और इसे दूसरे तर्क के रूप में __getitem__ पर भेजता है (पहला वाला यह है self)। [1] कोई अच्छा तरीका नहीं है कि __getitem__ व्यक्त करने के लिए और अधिक तर्क चाहते हैं, लेकिन इसकी कोई आवश्यकता नहीं है।



[1] अजगर 2.* में आप वास्तव में __getitem__ एक स्वत: unpacking हस्ताक्षर जो ValueError या TypeError बढ़ा देंगे जब आप बहुत अधिक या बहुत कम सूचकांक के साथ का अनुक्रमण रहे हैं दे सकते हैं .. ।:

>>> class X(object): 
... def __getitem__(self, (x, y)): return x, y 
... 
>>> x = X() 
>>> x[23, 45] 
(23, 45) 

चाहे कि "एक अच्छा तरीका है" विवादास्पद है ... यह अजगर 3 में बहिष्कार किया गया है ताकि आप अनुमान लगा सकते हैं कि गुइडो नहीं था लंबे प्रतिबिंब पर अच्छा पर विचार न करें ;-)। अपने स्वयं के अनपॅकिंग (हस्ताक्षर में एक ही तर्क का) करना कोई बड़ा सौदा नहीं है और आपको 1 बनाम, उदाहरण के साथ इस तरह के एक उदाहरण को अनुक्रमणित करने की बहुत ही समान त्रुटि के लिए अलग-अलग प्रकारों के बजाय स्पष्ट त्रुटियों (और वर्दी वाले) प्रदान करने देता है, 3 सूचकांक ;-)।

+0

3.x में अनपॅकिंग तर्क के बहिष्कार के बारे में मेरी समझ इतनी अधिक नहीं थी कि "गुइडो ने इसे अच्छा नहीं माना", लेकिन शायद ही कभी किसी को यह पता था कि इस भाषा में भी सुविधा मौजूद है, और यह संकलक को काफी जटिल बनाता है । –

+0

@ लॉरेंस, हाँ - जटिल और बहुत ही कम इस्तेमाल किया -> अच्छा नहीं! -) –

+2

मैंने नियमित रूप से इसका इस्तेमाल किया और यह काफी अच्छा था, लेकिन मुद्दा यह था कि यह जटिल प्रतिबिंब था। मैं इसे मुख्य रूप से लैम्ब्डा फ़ंक्शंस – Casebash

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