Volountary бесконечная рекурсия с Python - PullRequest
0 голосов
/ 02 января 2019

Я работаю на слушателя микрофона с Python (3.7).

Для работы с аудиопотоком я написал функцию, которая запускается в потоке и вызывает себя в конце (хвостовая рекурсия)

class Listener:
    # [...]

    def __init__(self, audio_conf: AudioConfiguration, listener_callback: Callable[[bytes], None] = None) -> None:
        self.__configuration = audio_conf
        if listener_callback:
            self.__listener_callback = listener_callback
        self.__stream = PyAudio().open(format=self.__configuration.FORMAT,  # p.get_format_from_width(WIDTH),
                                       channels=self.__configuration.CHANNELS,
                                       rate=self.__configuration.RATE,
                                       input=True,
                                       output=True,
                                       frames_per_buffer=self.__configuration.CHUNK)
        thread = Thread(target=self.__listen, args=())
        thread.start()

    # [...]
    def __listen(self) -> None:
        if self.__flag_deactivation:
            if self.__listener_callback:
                print(f"Call listener callback")
                p = Process(target=self.__listener_callback, args=(self.__active_buffer,))
                p.start()
                # p.join()
            self.reset_state()
        tmp_buffer: bytes = b""
        count: int = 0
        voice: int = 0
        for i in range(0, self.__configuration.FRAMES_LENGTH):
            tmp_buffer += self.__stream.read(self.__configuration.CHUNK_SIZE)  # read audio stream
            count += 1
            if self.__mic_tuning.is_voice():
                voice += 1
        self.__previous_buffer = tmp_buffer
        if self.__active:
            self.__active_buffer += tmp_buffer
        print(f"Listening {'active' if self.__active else 'background'} - Voice Threshold {voice / count}")
        self.__listen()

Очевидно, что Python жалуется на «Максимальную глубину рекурсии» ...

Есть ли способ:

  • избавиться от максимальной глубины рекурсии (но я думаю, что это не очень хорошая идея, это может скрыть некоторые другие проблемы ...)

  • или переписать это без хвостовой рекурсии (но сохранить эффективность)

Я давно не работаю с Python, поэтому буду рад узнать какой-нибудь "питонический" способ добиться этого без взлома поведения по умолчанию:)

Спасибо!

...