在Python3.6中输入hint一个同构队列的正确方法是什么(特别是对于PyCharm)?

dddzy1tm  于 2022-12-23  发布在  PyCharm
关注(0)|答案(3)|浏览(152)

我正在用Python 3.6编写一个分形生成器,我使用multiprocessing.Queue s将消息从主线程传递到工作线程,这是我目前为止尝试过的方法,但是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的标准方法。

hyrbngr7

hyrbngr71#

老问题了但我刚发现

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

在PyCharm中同时使用queue.Queuemultiprocessing.Queue

j91ykkif

j91ykkif2#

TypeVar应该有一个名称。
T = TypeVar("T")修复了该问题。

svujldwt

svujldwt3#

@Xtrem532的答案对我有效,但如果您不希望类型为字符串,请导入annotations

from __future__ import annotations

import multiprocessing as mp
import multiprocessing.queues as mpq

q1: mp.Queue[str] = mp.Queue()
q2: mpq.Queue[str] = mpq.Queue(ctx=mp.get_context())

我不得不使用multiprocessing.queues.Queue来让pylint通过。

相关问题