Повторяющаяся аннотация Python

В моем коде в двух местах употребляется следующая конструкция:

if typing.TYPE_CHECKING:
    from queue import Queue as ThreadingQueue
    from gevent.queue import Queue as GeventQueue
    from multiprocessing import MultiprocessingQueue

queue: typing.Union['MultiprocessingQueue', 'ThreadingQueue', 'GeventQueue']

Мне захотелось избавиться от дублирования и вынести это в файл настроек(не знаю, стоит ли так вообще делать, поправьте в комментариях, пожалуйста)

Я сделал следующее:

queue = Union['MultiprocessingQueue', 'ThreadingQueue', 'GeventQueue']

Но вот момент, пайчарм подчеркивает мне импорты после if TYPE_CHECKING серым цветом, что свидетельствует о том, что они не используются, но при удалении их после подчеркивает, что я передаю объект не того типа. Действенный вариант передавать в юнион сами объекты, без использования тайпчекинга, но кроме как в тайпхинтингах эти объекты не будут использоваться.


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

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

В отдельном модуле объявляете тип Queue:

import typing

if typing.TYPE_CHECKING:
    from queue import Queue as ThreadingQueue  # noqa
    from gevent.queue import Queue as GeventQueue  # noqa
    from multiprocessing import Queue as MultiprocessingQueue  # noqa

Queue = typing.Union['MultiprocessingQueue', 'ThreadingQueue', 'GeventQueue']

Комментарии # noqa добавлены, чтобы статические анализаторы кода (в том числе встроенный в PyCharm) не считали импорты неиспользуемыми (неиспользуемые импорты может при коммите удалить PyCharm, если в окне коммита не убрать галку "оптимизировать импорты"). Предложено участником @Roman Konoval.

В коде, где нужна аннотация с типом Queue, импортируем ее и пользуемся:

# Вместо module_name вставить имя модуля, где объявили тип Queue
from module_name import Queue

queue: Queue

queue = 123  # Статический анализатор покажет ошибку типов
→ Ссылка