获取错误“调用Python对象时超出了最大递归深度”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取错误“调用Python对象时超出了最大递归深度”相关的知识,希望对你有一定的参考价值。
所以我刚收到一个错误,我有点不明白是什么原因。
Traceback (most recent call last):
File "C:Usersutils.py", line 657, in script
logger.warn('Wopsiy! No word found!')
File "C:Usersutils.py", line 30, in warn
sys.stdout.write("{}{} {}".format(self.__timestamp(), '[' + self.name + '] -', colored(text, "yellow")))
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 40, in write
self.__convertor.write(text)
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 141, in write
self.write_and_convert(text)
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 166, in write_and_convert
self.write_plain_text(text, cursor, start)
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 174, in write_plain_text
self.wrapped.write(text[start:end])
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 40, in write
self.__convertor.write(text)
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 141, in write
self.write_and_convert(text)
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 169, in write_and_convert
self.write_plain_text(text, cursor, len(text))
File "C:Program FilesPython36libsite-packagescoloramaansitowin32.py", line 174, in write_plain_text
self.wrapped.write(text[start:end])
我可以看到它与我自己创建的记录器有一些看起来像:
实用工具类
from datetime import datetime
from termcolor import cprint, colored
import sys
import colorama
class Logger:
def __init__(self,name):
colorama.init()
self.name = name
@staticmethod
def __timestamp():
timestamp = str(datetime.now().strftime("[%H:%M:%S.%f")[:-3]+"]")
return timestamp
def warn(self, text):
sys.stdout.write("{}{} {}".format(self.__timestamp(), '[' + self.name + '] -', colored(text, "yellow")))
sys.stdout.write("
")
sys.stdout.flush()
基本上我也做了一个简单的代码,我的代码也是如此:
from utils import Logger
logger = Logger('Script')
def main():
logger = Logger("product_info")
word = ['Nope', 'There', 'Is', 'No', 'Word']
while True:
try:
for _ in infinity():
if 'Hello' in word:
print('WORKS!!')
else:
logger.warn('Wopsiy! No word found!')
time.sleep(1)
except Exception as err:
print(err)
time.sleep(1)
continue
所以问题是,经过一段时间它给了我一个maximum recursion depth exceeded while calling a Python object
的错误,但我只有在打印出except Exception as err:
时才能得到它,但是当我通过控制台看到它时,它给出了顶部给出的输出。
现在的问题是我实际上不知道它的原因是什么。
编辑
from datetime import datetime
from termcolor import cprint, colored
import sys
import colorama
colorama.init()
class Logger:
def __init__(self,name):
self.name = name
@staticmethod
def __timestamp():
timestamp = str(datetime.now().strftime("[%H:%M:%S.%f")[:-3]+"]")
return timestamp
def warn(self, text):
sys.stdout.write("{}{} {}".format(self.__timestamp(), '[' + self.name + '] -', colored(text, "yellow")))
sys.stdout.write("
")
sys.stdout.flush()
正如我从评论中的讨论中所理解的那样,您可以在执行脚本期间创建Logger
类的多个实例。每个Logger
的创作都会引用colorama.init()
。每次对colorama.init()
的调用迫使Colorama用colorama包裹的版本取代sys.stdout
和sys.stderr
溪流。
在对colorama.init
进行越来越多的调用之后,你的溪流变成了大量(无用的重复)colorama包装层的肥胖洋葱,并且对print
的一次调用必须逐层递归,直到达到实际的sys.stdout
。
当层数超过允许的最大堆栈深度时,您将获得异常。这种情况也在this open colorama issue中引用。
解决问题的最简单方法是将colorama.init()
移出Logger
构造函数,并在全局范围内使用类似的东西:
import colorama
colorama.init()
以上是关于获取错误“调用Python对象时超出了最大递归深度”的主要内容,如果未能解决你的问题,请参考以下文章