Повторяющаяся аннотация 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 шт):
В отдельном модуле объявляете тип 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 # Статический анализатор покажет ошибку типов