python当超过一定深度时会引发:RuntimeError: maximum recursion depth exceeded。
解决方案:
1、网上很多人给出的方案是调整sys.setrecursionlimit值,但这是一个治标不治本的方法。
2、优化代码不使用递归。
但有时候为了偷懒以及少点代码量(毕竟只有懒才能让我灵感爆发-。-)又想使用递归所以以上两种方案都不适合。于是就想能不能使用什么办法解决递归问题。
思考:
1、递归其实就是一直循环一个逻辑当达到条件时跳出。
2、python限制了深度,如何破解这个深度限制。
解决方案:
1、关于循环一个逻辑达到一个条件跳出倒好办可以使用一个循环来解决。
2、破解python限制深度,这目前俺还没有能力去做改解释器的能力所以就想了一个旁门左道,具体思路如下:
2.1、首先做一个函数钩子(装饰器),在此装饰器里自定义:计数变量,调用上限变量,跳出状态变量;逻辑是当计数变量==调用上限变量时返回所有参数,然后用返回的参数再作为参数调用需要递归的方法。
2.2、定义一个函数主逻辑就是一个死循环一直调用需要递归的方法,当达到你需要的条件时设置跳出变量为TRUE。跳出循环。
依据这个相法于是有了以下代码实现,以下代码只是一个DEMO,如需要使用到项目中可以按此逻辑设计一个MetaClass。
#!/usr/bin/env python3.6
# -*- encoding: utf-8 -*-
'''
@File : recursion.py
@Time : 2020/01/16 23:06:51
@Author : Tang Jing
@Version : 1.0.0
@Contact : yeihizhi@163.com
@License : (C)Copyright 2020
@Desc : None
'''
# here put the import lib
import functools
# code start
def recursion(func):
def wapper(*args, **kwargs):
try:
kwargs['count'] += 1
if kwargs['count'] == kwargs['upper-limit']:
return args, kwargs
return func(*args, **kwargs)
except Exception:
pass
return wapper
def recursionCall(func, upper_limit:int=200, *args, **wargs):
wargs['count'] = 1
wargs['upper-limit'] = upper_limit
wargs['break'] = False
while True:
args, wargs = func(*args, **wargs)
if not wargs['break']:
wargs['upper-limit'] = wargs['count']+upper_limit
else:
break
return args, wargs
if __name__ == "__main__":
@recursion
def gggd(*args, **kwargs):
if kwargs['bbb'] == 3001:
kwargs['break']= True
return args, kwargs
print(kwargs['bbb'])
kwargs['bbb']+=1
return gggd(*args, **kwargs)
kwargs={'bbb':1}
eee=recursionCall(gggd,**kwargs)
eeee=""