I started using pyright recently (over mypy) and it's finding a lot of issues that weren't coming up with mypy. For example
from multiprocessing import Queue
queue: Queue = Queue() # Type of "queue" is "Queue[Unknown]" [reportUnknownVariableType]
This is surprising to me because multiprocessing.Queue
doesn't appear to have a generic type argument when I inspect the source (python 3.9). Is this pyright making standard library types generic as a "feature" or am I just wrong about Queue somehow?
This is not a pyright feature and you're not wrong about how Queue works, rather, it's the result of the typeshed of
multiprocessing.Queue
having a generic argument, but the standard library implementation not having it.In general type checkers will look at the
.pyi
files over the.py
files, and use those for any information. Since the standard library does not have type hints in any of the .py files, it is then expected that the generic argument only shows up in the typeshed.Because the standard library implementation of Queue does not have this generic argument, you need a
from __future__ import annotations
import to be able to use theQueue[str]
from typeshed. The exact error you're currently getting is the type checker reporting that you did not do that, and kept it as an unspecifiedQueue
instead. This is the same error you would get if you annotated a function withList
Lastly, as pointed out in the comments to your post, this not working properly with pyright (e.g. it giving a different error when you typehint with just
Queue
) is (or at least was, it is said to be fixed now) indeed a bug, but I don't think that is related to your issue.