काम पर, मैं except
एक or
ऑपरेटर के साथ एक खंड पर ठोकर खाई :
try:
# Do something.
except IndexError or KeyError:
# ErrorHandling
मुझे पता है कि अपवाद कक्षाओं को एक टपल के रूप में पारित किया जाना चाहिए, लेकिन इसने मुझे कहा कि यह भी कारण नहीं होगा SyntaxError
।
इसलिए पहले मैं जांच करना चाहता था कि क्या यह वास्तव में काम करता है। और यह नहीं है।
>>> def with_or_raise(exc):
... try:
... raise exc()
... except IndexError or KeyError:
... print('Got ya!')
...
>>> with_or_raise(IndexError)
Got ya!
>>> with_or_raise(KeyError)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in with_or_raise
KeyError
इसलिए यह दूसरा अपवाद नहीं पकड़ पाया, और बाइटकोड को देखते हुए, यह स्पष्ट हो गया कि क्यों:
>>> import dis
>>> dis.dis(with_or_raise)
2 0 SETUP_EXCEPT 10 (to 12)
3 2 LOAD_FAST 0 (exc)
4 CALL_FUNCTION 0
6 RAISE_VARARGS 1
8 POP_BLOCK
10 JUMP_FORWARD 32 (to 44)
4 >> 12 DUP_TOP
14 LOAD_GLOBAL 0 (IndexError)
16 JUMP_IF_TRUE_OR_POP 20
18 LOAD_GLOBAL 1 (KeyError)
>> 20 COMPARE_OP 10 (exception match)
22 POP_JUMP_IF_FALSE 42
24 POP_TOP
26 POP_TOP
28 POP_TOP
5 30 LOAD_GLOBAL 2 (print)
32 LOAD_CONST 1 ('Got ya!')
34 CALL_FUNCTION 1
36 POP_TOP
38 POP_EXCEPT
40 JUMP_FORWARD 2 (to 44)
>> 42 END_FINALLY
>> 44 LOAD_CONST 0 (None)
46 RETURN_VALUE
तो हम देख सकते हैं, निर्देश 14 पहले IndexError
स्टैक पर कक्षा को लोड करता है । फिर यह जाँचता है कि क्या वह मूल्य है True
, जो कि पायथन सत्यता के कारण है और अंत में सीधे निर्देश के लिए कूदता है 20 जहां exception match
यह किया जाता है। चूंकि निर्देश 18 को छोड़ दिया गया था, KeyError
उसे स्टैक पर कभी भी लोड नहीं किया गया था और इसलिए यह मेल नहीं खाता।
मैंने पायथन 2.7 और 3.6 के साथ कोशिश की, एक ही परिणाम।
लेकिन फिर, यह मान्य सिंटैक्स क्यों है? मुझे लगता है कि यह निम्नलिखित में से एक है:
- यह पायथन के एक बहुत पुराने संस्करण से एक कलाकृति है।
or
एकexcept
खंड के भीतर उपयोग करने के लिए वास्तव में एक वैध उपयोग मामला है ।- यह केवल पायथन पार्सर की एक सीमा है जिसे
except
कीवर्ड के बाद किसी भी अभिव्यक्ति को स्वीकार करना पड़ सकता है ।
मेरा वोट 3 पर है (मैंने पायथन के लिए एक नए पार्सर के बारे में कुछ चर्चा देखी) लेकिन मुझे उम्मीद है कि कोई उस परिकल्पना की पुष्टि कर सकता है। क्योंकि अगर यह उदाहरण के लिए 2 था, तो मैं जानना चाहता हूं कि केस का उपयोग करें!
इसके अलावा, मैं उस खोज को कैसे जारी रखूंगा, इस बारे में थोड़ा स्पष्टता हूं। मुझे लगता है कि मुझे CPython parser के सोर्स कोड में खुदाई करनी होगी, लेकिन idk जहां इसे ढूंढना है और शायद वहाँ एक आसान तरीका है?