在 Python3.6 中键入提示同质队列的正确方法是啥(尤其是对于 PyCharm)?

Posted

技术标签:

【中文标题】在 Python3.6 中键入提示同质队列的正确方法是啥(尤其是对于 PyCharm)?【英文标题】:What is the correct way to type hint a homogenous Queue in Python3.6 (especially for PyCharm)?在 Python3.6 中键入提示同质队列的正确方法是什么(尤其是对于 PyCharm)? 【发布时间】:2018-08-04 00:22:40 【问题描述】:

我正在 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 类指定的类型。我也想知道是否有类似于此的类型提示队列的标准方法。

【问题讨论】:

【参考方案1】:

老问题,但我刚刚发现

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

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

【讨论】:

Path 应该是TypeVar 这里的@Xtrem532 吗?还是别的什么? iirc 这是一个名为 P 的队列,其中包含 pathlib.Path 对象【参考方案2】:

TypeVar 应该有一个名字。

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

【讨论】:

以上是关于在 Python3.6 中键入提示同质队列的正确方法是啥(尤其是对于 PyCharm)?的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 Python 3.6.2 在 Windows 7 上创建虚拟环境

Python 类型提示填充了 myclass 对象的双端队列

使用用户定义的类键入提示

在命令提示符中键入“ipconfig”会显示两个IPv4地址。哪一个是我的电脑?

第二周作业(产品同质化问题)

为文件或类似文件的对象键入提示?