获取错误“调用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.stdoutsys.stderr溪流。

在对colorama.init进行越来越多的调用之后,你的溪流变成了大量(无用的重复)colorama包装层的肥胖洋葱,并且对print的一次调用必须逐层递归,直到达到实际的sys.stdout

当层数超过允许的最大堆栈深度时,您将获得异常。这种情况也在this open colorama issue中引用。

解决问题的最简单方法是将colorama.init()移出Logger构造函数,并在全局范围内使用类似的东西:

import colorama
colorama.init()

以上是关于获取错误“调用Python对象时超出了最大递归深度”的主要内容,如果未能解决你的问题,请参考以下文章

Python:调用 Python 对象时超出了最大递归深度

Jquery attr()获取值错误

Java:如何获取错误信息?

请教获取CString长度错误

Terraform 错误:错误锁定状态:获取状态锁时出错:发生 2 个错误:

Codeigniter 获取数据错误:尝试获取非对象的属性