Использование библиотеки Basi c gTTS вызывает RuntimeError в Python 3.7. - PullRequest
0 голосов
/ 24 января 2020

Я успешно установил на своем компьютере библиотеку gTTS (Google Text-to-Speech) и запустил следующий простой код:

from gtts import gTTS
tts = gTTS('hello')

Но я получил это ошибка:

 "/usr/local/lib/python3.7/dist-packages/gtts/tts.py", line 114, in __init__
    for k, v in locals().items():
RuntimeError: dictionary changed size during iteration.

Что я делаю не так?

1 Ответ

0 голосов
/ 24 января 2020

Вы, кажется, не делаете ничего плохого. Кажется, это простая ошибка в библиотеке gTTS. Ниже приведен код ошибки : код предназначен только для целей отладки.

        # Debug
        for k, v in locals().items():
            if k == 'self':
                continue
            log.debug("%s: %s", k, v)

locals() возвращает словарь локальных переменных. Поведение недокументированное выглядит так, что этот словарь представляет собой представление локальных переменных в режиме реального времени, поэтому он обновляется динамически при объявлении новых локальных переменных, по крайней мере, в некоторых версиях Python (I Использую 3.6.2): ​​

>>> the_locals = locals()
>>> len(the_locals)
8
>>> 'x' in the_locals
False
>>> x = 12
>>> len(the_locals)
9
>>> 'x' in the_locals
True

Итак, проблема вызвана присваиванием k в методе __init__ во время итерации по этому словарю. Присвоение создает новую локальную переменную, добавляя ее в словарь во время итерации, что является нет-нет и приводит к возникновению ошибки.

Решением было бы перебрать копию словарь, например:

for k, v in dict(locals()).items():
    ...

Похоже, что это было сообщено на трекер проблем библиотеки на GitHub в 2018 году, но проблема была закрыта без исправления, предположительно потому, что человек кто открыл вопрос не предоставил достаточно информации. Я предлагаю открыть там новую проблему и предоставить как можно больше информации (ссылка на этот вопрос переполнения стека, вероятно, поможет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...