होम·एरर संदेश

python · Python

संदेश

RecursionError: maximum recursion depth exceeded

इसका मतलब

किसी function ने अपने आप को डिफ़ॉल्ट सीमा 1000 frames से भी गहरा बुलाया। सचमुच गहरी गणना की तुलना में कहीं ज़्यादा बार इसका अर्थ है कि रुकने की शर्त नहीं है या उस तक पहुँचा ही नहीं जाता; अप्रत्यक्ष recursion भी इसमें आती है, जैसे कोई __getattr__ या property जो अपना ही गुण फिर पढ़ता है। पहले traceback में दोहराए जा रहे दो-तीन frames खोजिए और base case ठीक कीजिए। sys.setrecursionlimit() सीमा बढ़ा देता है, पर वह असली C stack पार करने देता है, और तब Python अपवाद उठाने के बजाय पूरा ही मर जाता है — recursion को loop में बदलना सुरक्षित उत्तर है।

सुधार

इसका एक-लाइन कमांड नहीं है। व्याख्या में लिखा है कि क्या देखना है।

कौन देता है
python
Python
18

Python का traceback उत्तर को दो हिस्सों में बाँटता है — अंतिम पंक्ति बताती है कि क्या ग़लत हुआ, और उसके ऊपर के frames बताते हैं कि कहाँ — इसलिए केवल अंतिम पंक्ति पढ़ने पर नाम मिलता है और जगह छूट जाती है; और NoneType तथा KeyError जैसी "मान नहीं है" वाली त्रुटियों में कारण लगभग हमेशा उस frame से ऊपर होता है जहाँ गिरा।

एरर संदेश कैसे पढ़ें

  • पहली पंक्ति से पढ़ें। जितना नीचे जाएँगे उतना वह औज़ार के भीतर की बात है; कारण आम तौर पर सबसे ऊपर लिखा होता है।
  • फ़ाइल का नाम और पंक्ति संख्या दिखे तो वहीं से शुरू करें — stack का सबसे ऊपरी frame नहीं, बल्कि वह सबसे ऊपरी पंक्ति जिसमें आपकी लिखी फ़ाइल का नाम हो।
  • संदेश को जैसा है वैसा खोजें, पर पहले अपने paths और variable नाम हटा दें — वही खोज को अटकाते हैं।
  • वही स्थिति औज़ार के हर संस्करण में अलग शब्दों में आती है। नतीजे बेमेल लगें तो संस्करण संख्या भी जोड़ें।
  • कोई सुधार चिपकाने से पहले देख लें कि वह क्या फेंक देगा। इनमें कुछ पलटे नहीं जा सकते।

अक्सर पूछे जाने वाले सवाल

Q. “RecursionError: maximum recursion depth exceeded” का क्या मतलब है?

किसी function ने अपने आप को डिफ़ॉल्ट सीमा 1000 frames से भी गहरा बुलाया। सचमुच गहरी गणना की तुलना में कहीं ज़्यादा बार इसका अर्थ है कि रुकने की शर्त नहीं है या उस तक पहुँचा ही नहीं जाता; अप्रत्यक्ष recursion भी इसमें आती है, जैसे कोई __getattr__ या property जो अपना ही गुण फिर पढ़ता है। पहले traceback में दोहराए जा रहे दो-तीन frames खोजिए और base case ठीक कीजिए। sys.setrecursionlimit() सीमा बढ़ा देता है, पर वह असली C stack पार करने देता है, और तब Python अपवाद उठाने के बजाय पूरा ही मर जाता है — recursion को loop में बदलना सुरक्षित उत्तर है।

Q. इसे कैसे ठीक करें?

एक-लाइन कमांड नहीं है। ऊपर की व्याख्या में लिखा है कि क्या देखना है।

Q. यह कौन-सा औज़ार देता है?

python। यह Python में आता है, और संदेश 5 शब्दों का है।

साथ आने वाले एरर