-
-
Notifications
You must be signed in to change notification settings - Fork 32.6k
Closed
Labels
topic-multiprocessingtopic-typingtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
SimpleQueue
and Queue
classes from multiprocessing
module in Python 3.11.0 do not support type [str]
annotation.
Minimal, reproducible example:
from multiprocessing import Queue
multiprocessing_queue: Queue[str] = Queue()
or
from multiprocessing import SimpleQueue
multiprocessing_queue: SimpleQueue[str] = SimpleQueue()
Result - error:
multiprocessing_queue: SimpleQueue[str] = SimpleQueue()
~~~~~~~~~~~^^^^^
TypeError: 'method' object is not subscriptable
How it should work:
It should work like Queue
from the queue
module:
from queue import Queue
standard_queue: Queue[str] = Queue()
Result - no error.
Why do I need this?
I want my IDE to know that queue.get()
returns str
object.
Your environment
Python 3.11.0 arm64
Python 3.11.0 (main, Nov 4 2022, 17:22:54) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
MacBook M1 Pro macOS Ventura 13.0.1.
Linked PRs
linux4life798, simlmx, 3tothe6 and StSav012
Metadata
Metadata
Assignees
Labels
topic-multiprocessingtopic-typingtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
Milestone
Relationships
Development
Select code repository
Activity
__class_getitem__
tomultiprocessing.Queue
#99511pythongh-99509: Add `__class_getitem__` to `multiprocessing.Qeueu`
gh-99509: Add `__class_getitem__` to `multiprocessing.queues.Queue` (#…
Merged main into regmachine branch (#50)
linguini1 commentedon Jun 15, 2023
I am using Python 3.11.4 and still get this error:
And using
SimpleQueue subscripting only works when imported using
from multiprocessing.queues import SimpleQueue
.Starbuck5 commentedon Jul 10, 2023
I believe this should be re-opened.
As reviewers noted in the linked PR, the linked PR only solves it for an undocumented way to import Queue. Also, even with the new import it's not a drop in replacement. I tested with 3.12beta 3.
The new import yields an error.
To work around subscripting after this PR, you need to use the undocumented queue import and then provide this unknown context argument directly.
And of course the documented way of making a
Queue
still fails.hongwen000 commentedon Oct 1, 2023
@Starbuck5 Same issue
AlexWaygood commentedon Oct 1, 2023
To make both mypy and CPython happy, you can do something like this:
This accurately reflects the facts that:
multiprocessing.Queue()
is the documented, public-API way of creating the class; however,multiprocessing.Queue
itself is not a type (it's a method), so can't be used in a type annotationCould we special-case
multiprocessing.Queue
, perhaps by pretending in typeshed that it's a class rather than a method? Perhaps we could, but we like to avoid doing that kind of thing as much as possible. It's generally best for type checkers to be told the truth; lying to type checkers in typeshed about whether things are methods or classes can have unfortunate consequences. In any event, that conversation would probably need to take place on the https://github.com/python/typeshed/issues issue tracker rather than at CPython.Could
multiprocessing.Queue
itself be changed so that it's an actual class rather than a method? Again, perhaps. I'm not a multiprocessing expert, though (just a typing expert), so I can't really comment on that one.