Python3.6中如何正确地为同质队列进行类型提示(特别是在PyCharm中)?

25

我正在使用Python 3.6编写一个分形生成器,并且我使用来在主线程和工作线程之间传递消息。目前我尝试了以下方法,但是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类指定。我也想知道是否有一种类似于此的标准方法来提示队列的类型。

3个回答

37

老问题,但我刚刚发现

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

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


这里的 Path 应该是一个 TypeVar 吗,@Xtrem532?还是其他什么东西? - Intrastellar Explorer
1
如果我没记错的话,这是一个名为 P 的队列,其中包含 pathlib.Path 对象。 - Xtrem532
不错。即使IDE没有提示,我仍然需要import multiprocessing才能通过mypy。 - Ben Butterworth

3

TypeVar应该有一个名称。

T = TypeVar("T")可以解决这个问题。


2

@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。


我还是不得不引用它,mypy显示了关于类型(即Queue)不可进行下标操作的错误。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接