diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index fd0acec55d0460..bf546f8ae1d1cc 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -7,6 +7,7 @@ import logging import threading import time +import types FIRST_COMPLETED = 'FIRST_COMPLETED' FIRST_EXCEPTION = 'FIRST_EXCEPTION' @@ -544,6 +545,8 @@ def set_exception(self, exception): self._condition.notify_all() self._invoke_callbacks() + __class_getitem__ = classmethod(types.GenericAlias) + class Executor(object): """This is an abstract base class for concrete asynchronous executors.""" diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 2aa4e17d47fa7c..2810b357bc1e17 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -10,6 +10,7 @@ import itertools import queue import threading +import types import weakref import os @@ -57,6 +58,8 @@ def run(self): else: self.future.set_result(result) + __class_getitem__ = classmethod(types.GenericAlias) + def _worker(executor_reference, work_queue, initializer, initargs): if initializer is not None: diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py index 6694f5478bdadf..35ac2dc6ae280c 100644 --- a/Lib/http/cookies.py +++ b/Lib/http/cookies.py @@ -131,6 +131,7 @@ # import re import string +import types __all__ = ["CookieError", "BaseCookie", "SimpleCookie"] @@ -419,6 +420,8 @@ def OutputString(self, attrs=None): # Return the result return _semispacejoin(result) + __class_getitem__ = classmethod(types.GenericAlias) + # # Pattern for finding cookie diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 1668220c099571..9d490a1d8b3525 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -21,6 +21,7 @@ import array import queue import time +import types import os from os import getpid @@ -1129,6 +1130,8 @@ def set(self, value): return self._callmethod('set', (value,)) value = property(get, set) + __class_getitem__ = classmethod(types.GenericAlias) + BaseListProxy = MakeProxyType('BaseListProxy', ( '__add__', '__contains__', '__delitem__', '__getitem__', '__len__', diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 41dd923d4f9740..b8a0b827635f07 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -20,6 +20,7 @@ import threading import time import traceback +import types import warnings from queue import Empty @@ -780,6 +781,8 @@ def _set(self, i, obj): del self._cache[self._job] self._pool = None + __class_getitem__ = classmethod(types.GenericAlias) + AsyncResult = ApplyResult # create alias -- see #17805 # diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index d112db2cd981d1..835070118387ea 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -14,6 +14,7 @@ import threading import collections import time +import types import weakref import errno @@ -366,3 +367,5 @@ def put(self, obj): else: with self._wlock: self._writer.send_bytes(obj) + + __class_getitem__ = classmethod(types.GenericAlias) diff --git a/Lib/multiprocessing/shared_memory.py b/Lib/multiprocessing/shared_memory.py index 184e36704baaeb..9f954d9c38febd 100644 --- a/Lib/multiprocessing/shared_memory.py +++ b/Lib/multiprocessing/shared_memory.py @@ -14,6 +14,7 @@ import errno import struct import secrets +import types if os.name == "nt": import _winapi @@ -508,3 +509,5 @@ def index(self, value): return position else: raise ValueError(f"{value!r} not in this container") + + __class_getitem__ = classmethod(types.GenericAlias) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 9c5b23e5e5b0fc..3a7753355fbdd7 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -6,7 +6,14 @@ defaultdict, deque, OrderedDict, Counter, UserDict, UserList ) from collections.abc import * +from concurrent.futures import Future +from concurrent.futures.thread import _WorkItem from contextlib import AbstractContextManager, AbstractAsyncContextManager +from http.cookies import Morsel +from multiprocessing.managers import ValueProxy +from multiprocessing.pool import ApplyResult +from multiprocessing.shared_memory import ShareableList +from multiprocessing.queues import SimpleQueue from os import DirEntry from re import Pattern, Match from types import GenericAlias, MappingProxyType @@ -35,7 +42,11 @@ def test_subscriptable(self): Mapping, MutableMapping, MappingView, KeysView, ItemsView, ValuesView, Sequence, MutableSequence, - MappingProxyType, DirEntry + MappingProxyType, DirEntry, + ValueProxy, ApplyResult, + ShareableList, SimpleQueue, + Future, _WorkItem, + Morsel ): tname = t.__name__ with self.subTest(f"Testing {tname}"):