-
- Notifications
You must be signed in to change notification settings - Fork 33.7k
Closed
Labels
stdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
Bug description:
I think this is related to #119819
import logging.config from queue import SimpleQueue q = SimpleQueue() config = { 'version': 1, 'handlers': { 'sink': { 'class': 'logging.handlers.QueueHandler', 'queue': q, }, }, 'root': { 'handlers': ['sink'], }, } logging.config.dictConfig(config)ValueError: Unable to configure handler 'sink' SimpleQueue does not implement the full Queue interfaces thus both isinstance(obj, queue.Queue) and the queue interface check fails.
Since this has been working on 3.8 - <3.12 I think the queue interface check is checking for methods that are not used at all and should be adjusted accordingly.
Lines 500 to 525 in 2518918
| def _is_queue_like_object(obj): | |
| """Check that *obj* implements the Queue API.""" | |
| if isinstance(obj, queue.Queue): | |
| return True | |
| # defer importing multiprocessing as much as possible | |
| from multiprocessing.queues import Queue as MPQueue | |
| if isinstance(obj, MPQueue): | |
| return True | |
| # Depending on the multiprocessing start context, we cannot create | |
| # a multiprocessing.managers.BaseManager instance 'mm' to get the | |
| # runtime type of mm.Queue() or mm.JoinableQueue() (see gh-119819). | |
| # | |
| # Since we only need an object implementing the Queue API, we only | |
| # do a protocol check, but we do not use typing.runtime_checkable() | |
| # and typing.Protocol to reduce import time (see gh-121723). | |
| # | |
| # Ideally, we would have wanted to simply use strict type checking | |
| # instead of a protocol-based type checking since the latter does | |
| # not check the method signatures. | |
| queue_interface = [ | |
| 'empty', 'full', 'get', 'get_nowait', | |
| 'put', 'put_nowait', 'join', 'qsize', | |
| 'task_done', | |
| ] | |
| return all(callable(getattr(obj, method, None)) | |
| for method in queue_interface) |
Tested with 3.12.6
CPython versions tested on:
3.12
Operating systems tested on:
Windows
Linked PRs
Metadata
Metadata
Assignees
Labels
stdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
Status
Done