2009-03-23 15 views
12

list.index एक मनमाना मूल्य का उपयोग करने के बजाय अपवाद फेंकता है (उदाहरण के लिए, -1)? इसके पीछे क्या विचार है?पायथन सूची.इंडेक्स अपवाद फेंकता है जब सूचकांक नहीं मिला

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

EDIT: मुझे नहीं पता था कि -1 एक संभावित मान्य मान है। फिर भी, कुछ और क्यों नहीं? किसी के मूल्य के बारे में कैसे?

उत्तर

12

क्योंकि -1 स्वयं एक वैध अनुक्रमणिका है। यह None जैसे एक अलग मान का उपयोग कर सकता है, लेकिन यह उपयोगी नहीं होगा, जो -1 अन्य परिस्थितियों में हो सकता है (इस प्रकार str.find()), और केवल त्रुटि-जांच के लिए राशि होगी, जो वास्तव में अपवाद हैं।

3

अजगर में, -1 एक वैध सूचकांक है, सूची (शुरुआत के बजाय) के अंत से एक नंबर है, जिसका अर्थ है, इसलिए यदि आप

idx = mylist.index(someval) 
nextval = mylist[idx+1] 

तो ऐसा करने के लिए थे आप पहली बार मूल्य मिलेगा सरणी के बजाय, एक त्रुटि हुई थी। इस तरह आप अपवाद पकड़ सकते हैं और इससे निपट सकते हैं। आप अपवाद नहीं करना चाहते हैं, तो बस पहले उनकी जांच:

if someval in mylist: 
    idx = mylist.index(someval) 

संपादित करें: वहाँ वास्तव में लौटने से कोई नहीं में किसी भी बिंदु नहीं है, आप कोई भी के लिए परीक्षण करने के लिए जा रहे हैं, तो आप के रूप में अच्छी है कि क्या मूल्य का परीक्षण हो सकता है क्योंकि उपरोक्त सूची में है!

6

अच्छा, विशेष मूल्य वास्तव में None होना चाहिए, क्योंकि -1 एक वैध अनुक्रमणिका (जिसका अर्थ सूची का अंतिम तत्व है)।

idx = l.index(x) if x in l else None 
+2

जब तक आप सूची में दो बार खोज नहीं करते हैं .. –

+2

अच्छी तरह से, यह है या कोशिश/छोड़कर। – vartec

1

एक सरल विचार:

आपके द्वारा इस व्यवहार का अनुकरण कर सकते हैं -1 एक सूचकांक के रूप में पूरी तरह से प्रयोग करने योग्य है (के रूप में अन्य ऋणात्मक मानों हैं)।

8

डेविन की प्रतिक्रिया में जोड़ने के लिए: यह विशेष वापसी मूल्यों के बीच अपवादों के बीच एक पुरानी बहस है। कई प्रोग्रामिंग गुरु अपवाद पसंद करते हैं क्योंकि अपवाद पर, मुझे पूरा स्टैकट्रैक दिखाई देता है और तत्काल अनुमान लगाया जाता है कि क्या गलत है।

+1

यह वही था जो मैं सोच रहा था: विशेष वापसी मूल्य बनाम अपवाद। –

+3

+1: अपवाद कुछ मूल्य "पवित्र" पर निर्भर नहीं हैं। अपवाद अक्सर काम करने के लिए आसान होते हैं। –

+0

सिवायटियोफोबिक लोग तर्क दे सकते हैं कि 'इंडेक्स' ऑब्जेक्ट नहीं ढूंढ रहा है, कोई त्रुटि नहीं है, और अपवादों का उपयोग केवल त्रुटियों पर किया जाना चाहिए। मैं इस मामले में अपवादों के लिए हूं। अपवाद तेजी से हो सकते हैं क्योंकि उन्हें सफलता पर जांच करने की ज़रूरत नहीं है। पाइथन इस वजह से कई मामलों में अपवाद पसंद करते हैं। दूसरे शब्दों में, यदि 'इंडेक्स' को कोई वस्तु मिलती है, तो निष्पादन कोई शर्त जांच के साथ जारी रहता है। यदि 'इंडेक्स' को कुछ भी नहीं मिला है, तो आपको बिना चेक के कैच ब्लॉक में फेंक दिया जाता है। –

1

यह एक अर्थपूर्ण तर्क है। यदि आप किसी तत्व की अनुक्रमणिका जानना चाहते हैं, तो आप दावा कर रहे हैं कि यह सूची में पहले से मौजूद है। यदि आप जानना चाहते हैं कि यह मौजूद है या नहीं, तो आपको in का उपयोग करना चाहिए।

+1

... और यदि आप दावा करते हैं कि यह एक अपवाद है तो इसे संभालने का सही तरीका है। –

2

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

  • आप आमतौर पर (जैसे गणित या SQL)
  • आप भेद त्रुटि प्रकारों के बारे में परवाह नहीं है नेस्ट सजातीय प्रसंस्करण के बहुत सारे मिल गया है
  • आप परवाह नहीं है जहां त्रुटि हुई
  • संचालन शुद्ध कार्य हैं, बिना साइड इफेक्ट्स के।
  • विफलता उच्च स्तर पर एक उचित अर्थ दिया जा सकता है (उदाहरण के लिए "कोई पंक्ति का मिलान नहीं हुआ")
3

यह सुनिश्चित करना है कि त्रुटियों जितनी जल्दी हो सके पकड़े जाते हैं मुख्य रूप से है। उदाहरण के लिए, निम्नलिखित पर विचार:

l = [1, 2, 3] 
x = l.index("foo") #normally, this will raise an error 
l[x] #However, if line 2 returned None, it would error here 

आप देखेंगे कि एक त्रुटि बल्कि x = l.index("foo") में से l[x] पर फेंके गए जायेगा अगर सूचकांक कोई भी वापस आना था। इस उदाहरण में, यह वास्तव में एक बड़ा सौदा नहीं है। लेकिन कल्पना करें कि तीसरी पंक्ति एक लाख-लाइन कार्यक्रम में कुछ पूरी तरह से अलग जगह पर है। यह एक डीबगिंग दुःस्वप्न का थोड़ा सा कारण बन सकता है।

4

"अपवाद-बनाम त्रुटि मान" बहस आंशिक रूप से कोड स्पष्टता के बारे में है। कोई त्रुटि मान के साथ कोड पर विचार करें:

idx = sequence.index(x) 
if idx == ERROR: 
    # do error processing 
else: 
    print '%s occurred at position %s.' % (x, idx) 

त्रुटि हैंडलिंग हमारे एल्गोरिथ्म के बीच में भरवां समाप्त होता है, प्रोग्राम प्रवाह बाधित करता है। दूसरी ओर:

try: 
    idx = sequence.index(x) 
    print '%s occurred at position %s.' % (x, idx) 
except IndexError: 
    # do error processing 

इस मामले में, कोड की मात्रा को प्रभावी ढंग से ही है, लेकिन मुख्य एल्गोरिथ्म त्रुटि हैंडलिंग द्वारा अटूट है।

0
def GetListIndex(list, searchString): 
    try: 
     return list.index(searchString) 

    except ValueError: 
     return False 

    except Exception: 
     raise 
संबंधित मुद्दे