From d5060f7808d2b9a86ac4ca5c447750b089cd3c16 Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Wed, 10 Dec 2025 23:19:01 +0900 Subject: [PATCH 01/14] Add register_unbound in _crossinterp.py and initialize it in _queues.py --- Lib/concurrent/interpreters/_crossinterp.py | 4 ++++ Lib/concurrent/interpreters/_queues.py | 1 + 2 files changed, 5 insertions(+) diff --git a/Lib/concurrent/interpreters/_crossinterp.py b/Lib/concurrent/interpreters/_crossinterp.py index a5f46b20fbb4c5..6424318fe971eb 100644 --- a/Lib/concurrent/interpreters/_crossinterp.py +++ b/Lib/concurrent/interpreters/_crossinterp.py @@ -82,6 +82,10 @@ def __repr__(self): for k, v in _UNBOUND_CONSTANT_TO_FLAG.items()} +def register_unbound(unbound, flag): + _UNBOUND_CONSTANT_TO_FLAG[unbound] = flag + + def serialize_unbound(unbound): op = unbound try: diff --git a/Lib/concurrent/interpreters/_queues.py b/Lib/concurrent/interpreters/_queues.py index ee159d7de63827..29f05377eac779 100644 --- a/Lib/concurrent/interpreters/_queues.py +++ b/Lib/concurrent/interpreters/_queues.py @@ -47,6 +47,7 @@ class ItemInterpreterDestroyed(QueueError, UNBOUND = _crossinterp.UnboundItem.singleton('queue', __name__) +_crossinterp.register_unbound(UNBOUND, 3) def _serialize_unbound(unbound): From fb22cf6c3b544669254a942f237d9a126f99b442 Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Thu, 11 Dec 2025 00:20:22 +0900 Subject: [PATCH 02/14] Change to directly import UNBOUND. --- Lib/concurrent/interpreters/_crossinterp.py | 4 ---- Lib/concurrent/interpreters/_queues.py | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/Lib/concurrent/interpreters/_crossinterp.py b/Lib/concurrent/interpreters/_crossinterp.py index 6424318fe971eb..a5f46b20fbb4c5 100644 --- a/Lib/concurrent/interpreters/_crossinterp.py +++ b/Lib/concurrent/interpreters/_crossinterp.py @@ -82,10 +82,6 @@ def __repr__(self): for k, v in _UNBOUND_CONSTANT_TO_FLAG.items()} -def register_unbound(unbound, flag): - _UNBOUND_CONSTANT_TO_FLAG[unbound] = flag - - def serialize_unbound(unbound): op = unbound try: diff --git a/Lib/concurrent/interpreters/_queues.py b/Lib/concurrent/interpreters/_queues.py index 29f05377eac779..cb60be18b39e86 100644 --- a/Lib/concurrent/interpreters/_queues.py +++ b/Lib/concurrent/interpreters/_queues.py @@ -11,7 +11,7 @@ QueueError, QueueNotFoundError, ) from ._crossinterp import ( - UNBOUND_ERROR, UNBOUND_REMOVE, + UNBOUND, UNBOUND_ERROR, UNBOUND_REMOVE, ) __all__ = [ @@ -46,10 +46,6 @@ class ItemInterpreterDestroyed(QueueError, _PICKLED = 1 -UNBOUND = _crossinterp.UnboundItem.singleton('queue', __name__) -_crossinterp.register_unbound(UNBOUND, 3) - - def _serialize_unbound(unbound): if unbound is UNBOUND: unbound = _crossinterp.UNBOUND From 7c3245fbf46df4a397004ddfe52a89e148e76d76 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:27:59 +0000 Subject: [PATCH 03/14] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20b?= =?UTF-8?q?lurb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst diff --git a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst new file mode 100644 index 00000000000000..1da59fe68d78b5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst @@ -0,0 +1 @@ +Align UNBOUND usage in Lib/concurrent/interpreters/_queues.py and Lib/concurrent/interpreters/_crossinterp.py. From 32617a06c314fa2db2119d560c065d672c048fc7 Mon Sep 17 00:00:00 2001 From: Kir Date: Thu, 11 Dec 2025 00:28:57 +0900 Subject: [PATCH 04/14] Update 2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst --- .../next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst index 1da59fe68d78b5..1653dc050c37d2 100644 --- a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst +++ b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst @@ -1 +1 @@ -Align UNBOUND usage in Lib/concurrent/interpreters/_queues.py and Lib/concurrent/interpreters/_crossinterp.py. +Align UNBOUND in Lib/concurrent/interpreters/_queues.py and Lib/concurrent/interpreters/_crossinterp.py. From 5730fd50f7e5ef4d164a34466ee11e8ce9ba710d Mon Sep 17 00:00:00 2001 From: Kir Date: Thu, 11 Dec 2025 00:46:22 +0900 Subject: [PATCH 05/14] Update 2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst --- .../next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst index 1653dc050c37d2..684403a302d5f4 100644 --- a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst +++ b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst @@ -1 +1 @@ -Align UNBOUND in Lib/concurrent/interpreters/_queues.py and Lib/concurrent/interpreters/_crossinterp.py. +Unified the UNBOUND constant in the internal implementation of Lib/concurrent/interpreters. From fcb33853a7151d6fdb0e2a867215dae3a140c257 Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Thu, 11 Dec 2025 11:02:07 +0900 Subject: [PATCH 06/14] Add the repro test into test_queues.py. --- Lib/test/test_interpreters/test_queues.py | 9 +++++++++ .../2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_interpreters/test_queues.py b/Lib/test/test_interpreters/test_queues.py index 77334aea3836b9..c5e78235c855df 100644 --- a/Lib/test/test_interpreters/test_queues.py +++ b/Lib/test/test_interpreters/test_queues.py @@ -8,6 +8,7 @@ # Raise SkipTest if subinterpreters not supported. _queues = import_helper.import_module('_interpqueues') from concurrent import interpreters +from concurrent.futures import InterpreterPoolExecutor from concurrent.interpreters import _queues as queues, _crossinterp from .utils import _run_output, TestBase as _TestBase @@ -93,6 +94,14 @@ def test_bind_release(self): with self.assertRaises(queues.QueueError): _queues.release(qid) + def test_interpreter_pool_executor_after_reload(self): + # Regression test for gh-142414 (KeyError in serialize_unbound). + importlib.reload(queues) + code = "import struct" + with InterpreterPoolExecutor(max_workers=1) as executor: + results = executor.map(exec, [code] * 1) + self.assertEqual(list(results), [None] * 1) + class QueueTests(TestBase): diff --git a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst index 684403a302d5f4..9a9e03b47d0035 100644 --- a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst +++ b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst @@ -1 +1 @@ -Unified the UNBOUND constant in the internal implementation of Lib/concurrent/interpreters. +Fix spurious KeyError when concurrent.interpreters is reloaded after import. From 9a85aadd107438b42cd1f267cc7a0718d380d339 Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Thu, 11 Dec 2025 19:05:49 +0900 Subject: [PATCH 07/14] Address "./python -m test test_interpreters test_concurrent_futures.test_interpreter_pool" --- Lib/concurrent/interpreters/_crossinterp.py | 11 +++++++++++ .../test_concurrent_futures/test_interpreter_pool.py | 2 ++ 2 files changed, 13 insertions(+) diff --git a/Lib/concurrent/interpreters/_crossinterp.py b/Lib/concurrent/interpreters/_crossinterp.py index a5f46b20fbb4c5..46a596caed0cd9 100644 --- a/Lib/concurrent/interpreters/_crossinterp.py +++ b/Lib/concurrent/interpreters/_crossinterp.py @@ -68,6 +68,17 @@ def __repr__(self): return f'{self._MODULE}.{self._NAME}' # return f'interpreters._queues.UNBOUND' + def __hash__(self): + return hash((self._NAME, self._MODULE)) + + def __reduce__(self): + return self._NAME + + def __eq__(self, other): + if other is self: + return True + return repr(other) == repr(self) + UNBOUND = object.__new__(UnboundItem) UNBOUND_ERROR = object() diff --git a/Lib/test/test_concurrent_futures/test_interpreter_pool.py b/Lib/test/test_concurrent_futures/test_interpreter_pool.py index 7241fcc4b1e74d..5c84a42d74fee4 100644 --- a/Lib/test/test_concurrent_futures/test_interpreter_pool.py +++ b/Lib/test/test_concurrent_futures/test_interpreter_pool.py @@ -427,6 +427,8 @@ def run(taskid, ready, blocker): ready.get(timeout=1) # blocking except interpreters.QueueEmpty: pass + except queues.QueueEmpty: + pass else: done += 1 pending -= done From 4a7e0ee83c663662b0ad80f6d2ce3743b1f91fe1 Mon Sep 17 00:00:00 2001 From: Kir Date: Thu, 11 Dec 2025 23:21:00 +0900 Subject: [PATCH 08/14] Update Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst Co-authored-by: Peter Bierma --- .../next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst index 9a9e03b47d0035..147c6e4b5dee2c 100644 --- a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst +++ b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst @@ -1 +1 @@ -Fix spurious KeyError when concurrent.interpreters is reloaded after import. +Fix spurious :exc:`KeyError` when :mod:`concurrent.interpreters` is reloaded after import. From b6a206f17d467398eba17da3c89b86c35a36ada5 Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Fri, 12 Dec 2025 00:23:51 +0900 Subject: [PATCH 09/14] Remove picklable functions. We don't need to make singleton picklabe based on the current tests. --- Lib/concurrent/interpreters/_crossinterp.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Lib/concurrent/interpreters/_crossinterp.py b/Lib/concurrent/interpreters/_crossinterp.py index 46a596caed0cd9..a5f46b20fbb4c5 100644 --- a/Lib/concurrent/interpreters/_crossinterp.py +++ b/Lib/concurrent/interpreters/_crossinterp.py @@ -68,17 +68,6 @@ def __repr__(self): return f'{self._MODULE}.{self._NAME}' # return f'interpreters._queues.UNBOUND' - def __hash__(self): - return hash((self._NAME, self._MODULE)) - - def __reduce__(self): - return self._NAME - - def __eq__(self, other): - if other is self: - return True - return repr(other) == repr(self) - UNBOUND = object.__new__(UnboundItem) UNBOUND_ERROR = object() From b1287690a81748cc88114b8473af4c381aa6294f Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Thu, 11 Dec 2025 23:30:29 +0900 Subject: [PATCH 10/14] Convert singleton object to a normal object. --- Lib/concurrent/interpreters/_crossinterp.py | 58 ++++--------------- Lib/test/support/channels.py | 5 +- .../test_interpreter_pool.py | 21 +++++++ 3 files changed, 34 insertions(+), 50 deletions(-) diff --git a/Lib/concurrent/interpreters/_crossinterp.py b/Lib/concurrent/interpreters/_crossinterp.py index a5f46b20fbb4c5..4a09c92a2005be 100644 --- a/Lib/concurrent/interpreters/_crossinterp.py +++ b/Lib/concurrent/interpreters/_crossinterp.py @@ -5,30 +5,6 @@ class ItemInterpreterDestroyed(Exception): """Raised when trying to get an item whose interpreter was destroyed.""" -class classonly: - """A non-data descriptor that makes a value only visible on the class. - - This is like the "classmethod" builtin, but does not show up on - instances of the class. It may be used as a decorator. - """ - - def __init__(self, value): - self.value = value - self.getter = classmethod(value).__get__ - self.name = None - - def __set_name__(self, cls, name): - if self.name is not None: - raise TypeError('already used') - self.name = name - - def __get__(self, obj, cls): - if obj is not None: - raise AttributeError(self.name) - # called on the class - return self.getter(None, cls) - - class UnboundItem: """Represents a cross-interpreter item no longer bound to an interpreter. @@ -37,39 +13,29 @@ class UnboundItem: """ __slots__ = () - - @classonly - def singleton(cls, kind, module, name='UNBOUND'): - doc = cls.__doc__ - if doc: - doc = doc.replace( - 'cross-interpreter container', kind, - ).replace( - 'cross-interpreter', kind, - ) - subclass = type( - f'Unbound{kind.capitalize()}Item', - (cls,), - { - "_MODULE": module, - "_NAME": name, - "__doc__": doc, - }, - ) - return object.__new__(subclass) - _MODULE = __name__ _NAME = 'UNBOUND' def __new__(cls): raise Exception(f'use {cls._MODULE}.{cls._NAME}') + def __hash__(self): + return hash((self._NAME, self._MODULE)) + + def __reduce__(self): + return self._NAME + + def __eq__(self, other): + if other is self: + return True + return repr(other) == repr(self) + def __repr__(self): return f'{self._MODULE}.{self._NAME}' # return f'interpreters._queues.UNBOUND' -UNBOUND = object.__new__(UnboundItem) +UNBOUND = UnboundItem() UNBOUND_ERROR = object() UNBOUND_REMOVE = object() diff --git a/Lib/test/support/channels.py b/Lib/test/support/channels.py index fab1797659b312..1da6a0a9ea8bee 100644 --- a/Lib/test/support/channels.py +++ b/Lib/test/support/channels.py @@ -10,7 +10,7 @@ ChannelEmptyError, ChannelNotEmptyError, # noqa: F401 ) from concurrent.interpreters._crossinterp import ( - UNBOUND_ERROR, UNBOUND_REMOVE, + UNBOUND, UNBOUND_ERROR, UNBOUND_REMOVE, ) @@ -28,9 +28,6 @@ class ItemInterpreterDestroyed(ChannelError, """Raised from get() and get_nowait().""" -UNBOUND = _crossinterp.UnboundItem.singleton('queue', __name__) - - def _serialize_unbound(unbound): if unbound is UNBOUND: unbound = _crossinterp.UNBOUND diff --git a/Lib/test/test_concurrent_futures/test_interpreter_pool.py b/Lib/test/test_concurrent_futures/test_interpreter_pool.py index 5c84a42d74fee4..768fa7e7cb8206 100644 --- a/Lib/test/test_concurrent_futures/test_interpreter_pool.py +++ b/Lib/test/test_concurrent_futures/test_interpreter_pool.py @@ -516,6 +516,27 @@ def get_thread_name(): self.assertStartsWith(self.executor.submit(get_thread_name).result(), "InterpreterPoolExecutor-"[:15]) + def test_cross_interpreter_unbound_identity(self): + # Prepare shared queues. + input_q = interpreters.create_queue() + input_q.put(queues.UNBOUND) + result_q = interpreters.create_queue() + + # Create a sub-interpreter. + interp = interpreters.create() + interp.prepare_main({"input_q": input_q, "result_q": result_q}) + + # Run and compare the items in queue. + interp.exec(""" +from concurrent.interpreters import _queues as queues +obj = input_q.get() +is_identical = (obj is queues.UNBOUND) +result_q.put(is_identical) +""") + is_identical = result_q.get() + self.assertTrue(is_identical, "UNBOUND identity mismatch across interpreters") + + class AsyncioTest(InterpretersMixin, testasyncio_utils.TestCase): @classmethod From f74dcf90b12dfe94da2f5562cd424a0cf8fad161 Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Fri, 12 Dec 2025 17:53:14 +0900 Subject: [PATCH 11/14] Remove test_cross_interpreter_unbound_identity and picklabe object. --- Lib/concurrent/interpreters/_crossinterp.py | 32 +------------------ .../test_interpreter_pool.py | 21 ------------ 2 files changed, 1 insertion(+), 52 deletions(-) diff --git a/Lib/concurrent/interpreters/_crossinterp.py b/Lib/concurrent/interpreters/_crossinterp.py index 4a09c92a2005be..69b25a48fd4154 100644 --- a/Lib/concurrent/interpreters/_crossinterp.py +++ b/Lib/concurrent/interpreters/_crossinterp.py @@ -5,37 +5,7 @@ class ItemInterpreterDestroyed(Exception): """Raised when trying to get an item whose interpreter was destroyed.""" -class UnboundItem: - """Represents a cross-interpreter item no longer bound to an interpreter. - - An item is unbound when the interpreter that added it to the - cross-interpreter container is destroyed. - """ - - __slots__ = () - _MODULE = __name__ - _NAME = 'UNBOUND' - - def __new__(cls): - raise Exception(f'use {cls._MODULE}.{cls._NAME}') - - def __hash__(self): - return hash((self._NAME, self._MODULE)) - - def __reduce__(self): - return self._NAME - - def __eq__(self, other): - if other is self: - return True - return repr(other) == repr(self) - - def __repr__(self): - return f'{self._MODULE}.{self._NAME}' -# return f'interpreters._queues.UNBOUND' - - -UNBOUND = UnboundItem() +UNBOUND = object() UNBOUND_ERROR = object() UNBOUND_REMOVE = object() diff --git a/Lib/test/test_concurrent_futures/test_interpreter_pool.py b/Lib/test/test_concurrent_futures/test_interpreter_pool.py index 768fa7e7cb8206..5c84a42d74fee4 100644 --- a/Lib/test/test_concurrent_futures/test_interpreter_pool.py +++ b/Lib/test/test_concurrent_futures/test_interpreter_pool.py @@ -516,27 +516,6 @@ def get_thread_name(): self.assertStartsWith(self.executor.submit(get_thread_name).result(), "InterpreterPoolExecutor-"[:15]) - def test_cross_interpreter_unbound_identity(self): - # Prepare shared queues. - input_q = interpreters.create_queue() - input_q.put(queues.UNBOUND) - result_q = interpreters.create_queue() - - # Create a sub-interpreter. - interp = interpreters.create() - interp.prepare_main({"input_q": input_q, "result_q": result_q}) - - # Run and compare the items in queue. - interp.exec(""" -from concurrent.interpreters import _queues as queues -obj = input_q.get() -is_identical = (obj is queues.UNBOUND) -result_q.put(is_identical) -""") - is_identical = result_q.get() - self.assertTrue(is_identical, "UNBOUND identity mismatch across interpreters") - - class AsyncioTest(InterpretersMixin, testasyncio_utils.TestCase): @classmethod From d08f96e6469f301e3fb803db7b47bc9c453a552b Mon Sep 17 00:00:00 2001 From: Kir Date: Fri, 12 Dec 2025 21:57:08 +0900 Subject: [PATCH 12/14] Update Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst Co-authored-by: Victor Stinner --- .../next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst index 147c6e4b5dee2c..8574835b4246d0 100644 --- a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst +++ b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst @@ -1 +1 @@ -Fix spurious :exc:`KeyError` when :mod:`concurrent.interpreters` is reloaded after import. +Fix spurious :exc:`KeyError` when :mod:`concurrent.interpreters._queues` is reloaded after import. From 2534bbfcc15db9577d470bebbe89086b8cf9ad4d Mon Sep 17 00:00:00 2001 From: Kir Chou Date: Fri, 12 Dec 2025 22:01:57 +0900 Subject: [PATCH 13/14] Add a comment to explain why catch queues.QueueEmpty --- Lib/test/test_concurrent_futures/test_interpreter_pool.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_concurrent_futures/test_interpreter_pool.py b/Lib/test/test_concurrent_futures/test_interpreter_pool.py index 5c84a42d74fee4..2b4f8e98fa11b4 100644 --- a/Lib/test/test_concurrent_futures/test_interpreter_pool.py +++ b/Lib/test/test_concurrent_futures/test_interpreter_pool.py @@ -428,6 +428,8 @@ def run(taskid, ready, blocker): except interpreters.QueueEmpty: pass except queues.QueueEmpty: + # GH-142414: reloading the _queues module makes get to raise + # queues.QueueEmpty instead of interpreters.QueueEmpty. pass else: done += 1 From abb3dfebe5645e76e2f1e9ddd2f7784f8cfad558 Mon Sep 17 00:00:00 2001 From: Kir Date: Fri, 12 Dec 2025 22:14:50 +0900 Subject: [PATCH 14/14] Update Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst Co-authored-by: Victor Stinner --- .../next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst index 8574835b4246d0..94ec6d9f8fd368 100644 --- a/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst +++ b/Misc/NEWS.d/next/Library/2025-12-10-15-27-58.gh-issue-142414.zTHgP-.rst @@ -1 +1 @@ -Fix spurious :exc:`KeyError` when :mod:`concurrent.interpreters._queues` is reloaded after import. +Fix spurious :exc:`KeyError` when :mod:`!concurrent.interpreters._queues` is reloaded after import.