Получение ошибки «Максимальная глубина рекурсии превышена при вызове объекта Python» - PullRequest
0 голосов
/ 25 ноября 2018

Итак, я только что получил сообщение об ошибке, которое я вроде не понимаю, в чем причина.

Traceback (most recent call last):
  File "C:\Users\utils.py", line 657, in script
    logger.warn('Wopsiy! No word found!')
  File "C:\Users\utils.py", line 30, in warn
    sys.stdout.write("{}{} {}".format(self.__timestamp(), '[' + self.name + '] -', colored(text, "yellow")))
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 40, in write
    self.__convertor.write(text)
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 141, in write
    self.write_and_convert(text)
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 166, in write_and_convert
    self.write_plain_text(text, cursor, start)
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 174, in write_plain_text
    self.wrapped.write(text[start:end])
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 40, in write
    self.__convertor.write(text)
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 141, in write
    self.write_and_convert(text)
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 169, in write_and_convert
    self.write_plain_text(text, cursor, len(text))
  File "C:\Program Files\Python36\lib\site-packages\colorama\ansitowin32.py", line 174, in write_plain_text
    self.wrapped.write(text[start:end])

Как я вижу, у него есть что-то с созданным мной регистратором, которое выглядит так:

Utils class

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("\n")
        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("\n")
        sys.stdout.flush()

1 Ответ

0 голосов
/ 25 ноября 2018

Как я понял из обсуждения в комментариях к вопросу, вы можете создать несколько экземпляров класса Logger во время выполнения вашего скрипта.Каждое создание Logger вызывает colorama.init().Каждый вызов colorama.init() заставляет Colorama заменять потоки sys.stdout и sys.stderr их версиями в колораме.

После все новых и новых вызовов colorama.init ваши потоки превращаются в толстый лук множества(бесполезно повторяется) слои-обертки colorama, и один вызов print должен проходить рекурсивно от слоя к слою, пока не достигнет фактического sys.stdout.

Когда количество слоев превышает максимально допустимый стекглубина, вы получите свое исключение.На эту ситуацию также ссылаются в этой проблеме открытой колорамы .

Самый простой способ решить эту проблему - переместить colorama.init() из конструктора Logger и получить что-то подобноевместо этого:

import colorama
colorama.init()
...