2015-09-16 6 views
6

तो मैं उस में दो तरीकों के साथ एक वर्ग है:रिटर्निंग हमेशा `None` अजगर देता

class Test: 
    def cycle(self, n=float("inf"), block="x"): 
     try:    
      self.cycle(n-1, block) 
     except RuntimeError as e: 
      if str(e) == "maximum recursion depth exceeded": 
       print("... forever") 
       return 10 
    def f(self): 
     try: 
      raise Exception() 
     except: 
      return 10 
     return 20 


x = Test() 
print(x.cycle()) 
print(x.f()) 

और यह आउटपुट:

... forever 
None 
10 

क्या देता है? मैं एक से क्यों लौट सकता हूं और दूसरे को नहीं? मैं सामान्य रूप से पहले से ही प्रिंट कर सकता हूं, लेकिन यह हमेशा None

+0

हम, मैं सिर्फ ''10 से बाहर' वापसी की कोशिश करता हूं, जबकि रनटाइम त्रुटि को ई:' के रूप में छोड़कर। और यह काम कर रहा है। –

उत्तर

4

क्योंकि विधि cycle() पुनरावर्ती है, लेकिन जब आप इसे बार-बार कॉल करते हैं तो आप रिकर्सिव कॉल द्वारा लौटाए गए परिणाम को वापस नहीं कर रहे हैं।

तो self.cycle() अंदर, मान लीजिए कि आपको लगता है कि में फिर से self.cycle() फोन, और फिर जब self.cycle() RuntimeError होता है कॉल करने के लिए कोशिश कर रहा है, ताकि कॉल 10 रिटर्न पहले self.cycle() कॉल करने के लिए वापस, लेकिन यह (की सुविधा देता है पहले self.cycle() कहते हैं) कॉल करता है इस परिणाम को वापस अपने कॉलर पर वापस न करें, इसलिए दूसरे self.cycle() द्वारा परिणाम लौटा दिया गया है, और आप None लौट आए हैं।

यदि आप self.cycle() कॉल का परिणाम वापस कर देते हैं, तो आपको सही परिणाम मिलना चाहिए। उदाहरण -

>>> import sys 
>>> sys.setrecursionlimit(3) 
>>> class Test: 
...  def cycle(self, n=float("inf"), block="x"): 
...   try: 
...    return self.cycle(n-1, block) 
...   except RuntimeError as e: 
...    if str(e) == "maximum recursion depth exceeded": 
...     print("... forever") 
...     return 10 
... 
>>> t = Test() 
>>> print(t.cycle()) 
... forever 
10 

कृपया ध्यान दें, मैं करने के लिए 3 प्रत्यावर्तन सीमा निर्धारित ताकि प्रत्यावर्तन गहराई से अधिक हो गई प्रत्यावर्तन के 3 स्तरों के बाद त्रुटि तब होती है।

+0

आह, मेरे बारे में मूर्खतापूर्ण। यहां मैं सोच रहा था कि पाइथन के पास 'रनटाइम एरर' को संभालने का एक विशेष जटिल तरीका था जब यह केवल मिस्ड 'रिटर्न' कथन था। धन्यवाद – River

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