Python может запускать цикл while до RuntimeError: превышена максимальная глубина рекурсии при вызове объекта Python

Я запускаю рекурсивный цикл для достижения максимальной оптимизации чего-то и достигаю точки, когда код достигает RuntimeError: maximum recursion depth exceeded while calling a Python object. Это ожидаемо, но я хочу остановить код прямо перед тем, как он столкнется с этой ошибкой, чтобы я мог просмотреть свои данные в этот момент.

Возможно ли, чтобы циклы while говорили что-то подобное? Что-то вроде «Эй, запусти этот цикл, пока не достигнешь максимальной глубины рекурсии. Как только она будет достигнута, остановись и вернись».

Спасибо за помощь!


person user1530318    schedule 24.08.2012    source источник
comment
вы можете использовать pdb, чтобы поймать его при ошибке и проверить среду   -  person TJD    schedule 24.08.2012


Ответы (3)


Вы можете сделать следующее

def recurse():
  try:
    recurse()
  except RuntimeError as e:
    if e.message == 'maximum recursion depth exceeded while calling a Python object':
      # don't recurse any longer
    else:
      # something else went wrong

http://docs.python.org/tutorial/errors.html

ПРИМЕЧАНИЕ. Возможно, стоит узнать номер ошибки максимальной глубины рекурсии и проверить его вместо строки ошибки.

person Matti Lyra    schedule 24.08.2012

Возможно, есть рекурсивный вызов в блоке try/except RuntimeError? Когда исключение вызывается, возвращайте значение.

РЕДАКТИРОВАТЬ: Да, это возможно, вот так:

def recursion(i):
    try:
        return recursion(i+1)
    except RuntimeError:
        return i

a=0
print recursion(a)
person Aaron S    schedule 24.08.2012

Сохраните sys.maxrecursionlimit() как переменную (скажем, maxrec) в более глобальной области. Каждый раз, когда вы выполняете рекурсию, вычтите 1 из maxrec. Проверьте перед рекурсией, чтобы убедиться, что maxrec не 0. Если maxrec достигает 0, вы будете знать, что достигли предела рекурсии, и вы можете уйти.

def myFunc(params):
    # do stuff
    if maxrec <= 0:
        return # return whatever you need to
    if maxrec > 0:
        maxrec -= 1
        myFunc(params)

maxrec = sys.getrecursionlimit()
myFunc(params)

Надеюсь это поможет

person inspectorG4dget    schedule 24.08.2012