Каков правильный способ ввода подсказки для однородной очереди в Python3.6 (особенно для PyCharm)?

Я пишу генератор фракталов на Python 3.6 и использую multiprocessing.Queues для передачи сообщений из основного потока рабочим. Это то, что я пробовал до сих пор, но PyCharm, похоже, не может вывести типы атрибутов для элементов, взятых из очередей:

from typing import NamedTuple, Any, Generic, TypeVar, Tuple
from multiprocessing import Process, Queue

T = TypeVar()


class Message(NamedTuple):
    method: str
    id: str
    data: Any = None


class TypedQueue(Generic[T]):
    def get(self) -> T:
        ...
    def put(self, m: T) -> None:
        ...


MessageQ = TypedQueue[Message]


class FractalWorker(Process):
    def __init__(self, work: MessageQ, results: MessageQ)
        super().__init__()
        self.work = work
        self.results = results

    @staticmethod
    def make_queues() -> Tuple[MessageQ, MessageQ]:
        work = cast(MessageQ, Queue())
        results = cast(MessageQ, Queue())
        return work, results

Я хочу, чтобы PyCharm мог сказать, что атрибуты результата self.work.get имеют типы, указанные классом Message. Я также хочу знать, существует ли стандартный способ подсказки типа Queues, подобный этому.


person Broseph    schedule 23.02.2018    source источник


Ответы (2)


TypeVar должно иметь имя.

T = TypeVar("T") решает проблему.

person user2235698    schedule 26.02.2018

Старый вопрос, но я только что нашел

P: "Queue[Path]" = Queue()

для работы с queue.Queue и multiprocessing.Queue в PyCharm

person Xtrem532    schedule 30.08.2019
comment
Здесь Path должно быть TypeVar @Xtrem532? Или что-то другое? - person Intrastellar Explorer; 03.09.2020
comment
iirc это была очередь с именем P, содержащая pathlib.Path объектов - person Xtrem532; 04.09.2020