-
-
Notifications
You must be signed in to change notification settings - Fork 33.2k
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