Почему не работает пакет питона pymorphy2?

Установил модуль pymorphy2 в виртуальное окружение, импортировал и вызвал класс из этого модуля, после этого интерпретатор вернул мне ошибку. Всё работало хорошо пока не обновил Python до 3.11


Мой код

import pymorphy2
morph = pymorphy2.MorphAnalyzer()

Ошибка

Traceback (most recent call last):
  File "S:\.admin\.Files\.Python\.AiogramBot\main.py", line 3, in <module>
    morph = pymorphy2.MorphAnalyzer()
            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "S:\.admin\.Files\.Python\.AiogramBot\venv\Lib\site-packages\pymorphy2\analyzer.py", line 224, in __init__
    self._init_units(units)
  File "S:\.admin\.Files\.Python\.AiogramBot\venv\Lib\site-packages\pymorphy2\analyzer.py", line 235, in _init_units
    self._units.append((self._bound_unit(unit), False))
                        ^^^^^^^^^^^^^^^^^^^^^^
  File "S:\.admin\.Files\.Python\.AiogramBot\venv\Lib\site-packages\pymorphy2\analyzer.py", line 246, in _bound_unit
    unit = unit.clone()
           ^^^^^^^^^^^^
  File "S:\.admin\.Files\.Python\.AiogramBot\venv\Lib\site-packages\pymorphy2\units\base.py", line 35, in clone
    return self.__class__(**self._get_params())
                            ^^^^^^^^^^^^^^^^^^
  File "S:\.admin\.Files\.Python\.AiogramBot\venv\Lib\site-packages\pymorphy2\units\base.py", line 76, in _get_params
    (key, getattr(self, key, None)) for key in self._get_param_names()
                                               ^^^^^^^^^^^^^^^^^^^^^^^
  File "S:\.admin\.Files\.Python\.AiogramBot\venv\Lib\site-packages\pymorphy2\units\base.py", line 70, in _get_param_names
    args, varargs, kw, default = inspect.getargspec(cls.__init__)
                                 ^^^^^^^^^^^^^^^^^^
AttributeError: module 'inspect' has no attribute 'getargspec'. Did you mean: 'getargs'?

Ответы (3 шт):

Автор решения: Gnifajio

Судя по ошибке, функция inspect.getargspec в Python 3.11 уже не доступна. Вместо неё можно использовать функцию inspect.signature.

Примерно так:

import inspect

def foo(a: int, b: str, *, c: float = 1.0) -> bool:
    pass

sig = inspect.signature(foo)
print(sig)
# <Signature (a:int, b:str, *, c:float=1.0) -> bool>

Попробуйте обновить модуль pymorphy2 и заменить использование inspect.getargspec на inspect.signature.

Полезные ссылки:

Документация по функции inspect.signature

Статья на хабре "Что нового в Python 3.11"

→ Ссылка
Автор решения: insolor

Информация будет обновляться.

Я когда-то немного контрибьютил в pymorphy2, слежу за ситуацией с ним.

Проект pymorphy2 в последнее время (годы) находится в замороженном состоянии (см. issue Проект кажется заброшенным, обновление), крайний коммит в master - от сентября 2020 года, автор долгое время не отвечал на issues и pull-реквесты.

Поддержку Python 3.11 в него не добавлена, хотя есть соответствующий pull-request (в данный момент он закрыт, но в принципе он есть).

Сейчас можно воспользоваться форком pymorphy2 - pymorphy3, поддержку Python 3.11 в него уже влили.

pip install pymorphy3

Установка словарей, если они вдруг не установились вместе с pymorphy3 (словари от pymorphy2 не подойдут, там есть разница в формате самих словарей):

pip install pymorphy3-dicts-ru

Недавно автор pymorphy2 все-таки откликнулся, проект перенесли в отдельную организацию. Планируется, что он будет поддерживаться несколькими меинтейнерами (а не одним человеком, от которого все зависит, как было до этого).

→ Ссылка
Автор решения: AdamBaverman

Можно внести правки в библиотеку самостоятельно, взяв их из pull-request.

Там нужно исправить в двух местах единственный файл - pymorphy2/units/base.py

Лично мне это помогло убрать ошибку и библиотека pymorphy2 заработала на Python 3.11

→ Ссылка