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.
|
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
Bug report
Bug description:
I think this is related to #119819
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.
cpython/Lib/logging/config.py
Lines 500 to 525 in 2518918
Tested with 3.12.6
CPython versions tested on:
3.12
Operating systems tested on:
Windows
Linked PRs