bpo-39481: PEP 585 for a variety of modules (GH-19423)

- concurrent.futures
- ctypes
- http.cookies
- multiprocessing
- queue
- tempfile
- unittest.case
- urllib.parse
This commit is contained in:
Batuhan Taşkaya 2020-04-10 17:46:36 +03:00 committed by GitHub
parent e3ec44d692
commit 0361556537
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 66 additions and 1 deletions

View File

@ -7,6 +7,7 @@ import collections
import logging import logging
import threading import threading
import time import time
import types
FIRST_COMPLETED = 'FIRST_COMPLETED' FIRST_COMPLETED = 'FIRST_COMPLETED'
FIRST_EXCEPTION = 'FIRST_EXCEPTION' FIRST_EXCEPTION = 'FIRST_EXCEPTION'
@ -544,6 +545,8 @@ class Future(object):
self._condition.notify_all() self._condition.notify_all()
self._invoke_callbacks() self._invoke_callbacks()
__class_getitem__ = classmethod(types.GenericAlias)
class Executor(object): class Executor(object):
"""This is an abstract base class for concrete asynchronous executors.""" """This is an abstract base class for concrete asynchronous executors."""

View File

@ -10,6 +10,7 @@ from concurrent.futures import _base
import itertools import itertools
import queue import queue
import threading import threading
import types
import weakref import weakref
import os import os
@ -57,6 +58,8 @@ class _WorkItem(object):
else: else:
self.future.set_result(result) self.future.set_result(result)
__class_getitem__ = classmethod(types.GenericAlias)
def _worker(executor_reference, work_queue, initializer, initargs): def _worker(executor_reference, work_queue, initializer, initargs):
if initializer is not None: if initializer is not None:

View File

@ -1,6 +1,7 @@
"""create and manipulate C data types in Python""" """create and manipulate C data types in Python"""
import os as _os, sys as _sys import os as _os, sys as _sys
import types as _types
__version__ = "1.1.0" __version__ = "1.1.0"
@ -450,6 +451,8 @@ class LibraryLoader(object):
def LoadLibrary(self, name): def LoadLibrary(self, name):
return self._dlltype(name) return self._dlltype(name)
__class_getitem__ = classmethod(_types.GenericAlias)
cdll = LibraryLoader(CDLL) cdll = LibraryLoader(CDLL)
pydll = LibraryLoader(PyDLL) pydll = LibraryLoader(PyDLL)

View File

@ -131,6 +131,7 @@ Finis.
# #
import re import re
import string import string
import types
__all__ = ["CookieError", "BaseCookie", "SimpleCookie"] __all__ = ["CookieError", "BaseCookie", "SimpleCookie"]
@ -419,6 +420,8 @@ class Morsel(dict):
# Return the result # Return the result
return _semispacejoin(result) return _semispacejoin(result)
__class_getitem__ = classmethod(types.GenericAlias)
# #
# Pattern for finding cookie # Pattern for finding cookie

View File

@ -21,6 +21,7 @@ import signal
import array import array
import queue import queue
import time import time
import types
import os import os
from os import getpid from os import getpid
@ -1129,6 +1130,8 @@ class ValueProxy(BaseProxy):
return self._callmethod('set', (value,)) return self._callmethod('set', (value,))
value = property(get, set) value = property(get, set)
__class_getitem__ = classmethod(types.GenericAlias)
BaseListProxy = MakeProxyType('BaseListProxy', ( BaseListProxy = MakeProxyType('BaseListProxy', (
'__add__', '__contains__', '__delitem__', '__getitem__', '__len__', '__add__', '__contains__', '__delitem__', '__getitem__', '__len__',

View File

@ -20,6 +20,7 @@ import queue
import threading import threading
import time import time
import traceback import traceback
import types
import warnings import warnings
from queue import Empty from queue import Empty
@ -780,6 +781,8 @@ class ApplyResult(object):
del self._cache[self._job] del self._cache[self._job]
self._pool = None self._pool = None
__class_getitem__ = classmethod(types.GenericAlias)
AsyncResult = ApplyResult # create alias -- see #17805 AsyncResult = ApplyResult # create alias -- see #17805
# #

View File

@ -14,6 +14,7 @@ import os
import threading import threading
import collections import collections
import time import time
import types
import weakref import weakref
import errno import errno
@ -366,3 +367,5 @@ class SimpleQueue(object):
else: else:
with self._wlock: with self._wlock:
self._writer.send_bytes(obj) self._writer.send_bytes(obj)
__class_getitem__ = classmethod(types.GenericAlias)

View File

@ -14,6 +14,7 @@ import os
import errno import errno
import struct import struct
import secrets import secrets
import types
if os.name == "nt": if os.name == "nt":
import _winapi import _winapi
@ -508,3 +509,5 @@ class ShareableList:
return position return position
else: else:
raise ValueError(f"{value!r} not in this container") raise ValueError(f"{value!r} not in this container")
__class_getitem__ = classmethod(types.GenericAlias)

View File

@ -1,6 +1,7 @@
'''A multi-producer, multi-consumer queue.''' '''A multi-producer, multi-consumer queue.'''
import threading import threading
import types
from collections import deque from collections import deque
from heapq import heappush, heappop from heapq import heappush, heappop
from time import monotonic as time from time import monotonic as time
@ -216,6 +217,8 @@ class Queue:
def _get(self): def _get(self):
return self.queue.popleft() return self.queue.popleft()
__class_getitem__ = classmethod(types.GenericAlias)
class PriorityQueue(Queue): class PriorityQueue(Queue):
'''Variant of Queue that retrieves open entries in priority order (lowest first). '''Variant of Queue that retrieves open entries in priority order (lowest first).
@ -316,6 +319,8 @@ class _PySimpleQueue:
'''Return the approximate size of the queue (not reliable!).''' '''Return the approximate size of the queue (not reliable!).'''
return len(self._queue) return len(self._queue)
__class_getitem__ = classmethod(types.GenericAlias)
if SimpleQueue is None: if SimpleQueue is None:
SimpleQueue = _PySimpleQueue SimpleQueue = _PySimpleQueue

View File

@ -829,3 +829,5 @@ class TemporaryDirectory(object):
def cleanup(self): def cleanup(self):
if self._finalizer.detach(): if self._finalizer.detach():
self._rmtree(self.name) self._rmtree(self.name)
__class_getitem__ = classmethod(_types.GenericAlias)

View File

@ -6,16 +6,28 @@ from collections import (
defaultdict, deque, OrderedDict, Counter, UserDict, UserList defaultdict, deque, OrderedDict, Counter, UserDict, UserList
) )
from collections.abc import * from collections.abc import *
from concurrent.futures import Future
from concurrent.futures.thread import _WorkItem
from contextlib import AbstractContextManager, AbstractAsyncContextManager from contextlib import AbstractContextManager, AbstractAsyncContextManager
from ctypes import Array, LibraryLoader
from difflib import SequenceMatcher from difflib import SequenceMatcher
from filecmp import dircmp from filecmp import dircmp
from fileinput import FileInput from fileinput import FileInput
from mmap import mmap from mmap import mmap
from ipaddress import IPv4Network, IPv4Interface, IPv6Network, IPv6Interface from ipaddress import IPv4Network, IPv4Interface, IPv6Network, IPv6Interface
from itertools import chain from itertools import chain
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 os import DirEntry
from re import Pattern, Match from re import Pattern, Match
from types import GenericAlias, MappingProxyType, AsyncGeneratorType from types import GenericAlias, MappingProxyType, AsyncGeneratorType
from tempfile import TemporaryDirectory, SpooledTemporaryFile
from urllib.parse import SplitResult, ParseResult
from unittest.case import _AssertRaisesContext
from queue import Queue, SimpleQueue
import typing import typing
from typing import TypeVar from typing import TypeVar
@ -49,6 +61,15 @@ class BaseTest(unittest.TestCase):
DirEntry, DirEntry,
IPv4Network, IPv4Interface, IPv6Network, IPv6Interface, IPv4Network, IPv4Interface, IPv6Network, IPv6Interface,
chain, chain,
TemporaryDirectory, SpooledTemporaryFile,
Queue, SimpleQueue,
_AssertRaisesContext,
Array, LibraryLoader,
SplitResult, ParseResult,
ValueProxy, ApplyResult,
ShareableList, SimpleQueue,
Future, _WorkItem,
Morsel,
): ):
tname = t.__name__ tname = t.__name__
with self.subTest(f"Testing {tname}"): with self.subTest(f"Testing {tname}"):

View File

@ -241,6 +241,8 @@ class _AssertRaisesContext(_AssertRaisesBaseContext):
expected_regex.pattern, str(exc_value))) expected_regex.pattern, str(exc_value)))
return True return True
__class_getitem__ = classmethod(types.GenericAlias)
class _AssertWarnsContext(_AssertRaisesBaseContext): class _AssertWarnsContext(_AssertRaisesBaseContext):
"""A context manager used to implement TestCase.assertWarns* methods.""" """A context manager used to implement TestCase.assertWarns* methods."""

View File

@ -29,6 +29,7 @@ test_urlparse.py provides a good indicator of parsing behavior.
import re import re
import sys import sys
import types
import collections import collections
import warnings import warnings
@ -176,6 +177,8 @@ class _NetlocResultMixinBase(object):
raise ValueError("Port out of range 0-65535") raise ValueError("Port out of range 0-65535")
return port return port
__class_getitem__ = classmethod(types.GenericAlias)
class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr): class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr):
__slots__ = () __slots__ = ()

View File

@ -4798,6 +4798,12 @@ Array_length(PyObject *myself)
return self->b_length; return self->b_length;
} }
static PyMethodDef Array_methods[] = {
{"__class_getitem__", (PyCFunction)Py_GenericAlias,
METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
{ NULL, NULL }
};
static PySequenceMethods Array_as_sequence = { static PySequenceMethods Array_as_sequence = {
Array_length, /* sq_length; */ Array_length, /* sq_length; */
0, /* sq_concat; */ 0, /* sq_concat; */
@ -4846,7 +4852,7 @@ PyTypeObject PyCArray_Type = {
0, /* tp_weaklistoffset */ 0, /* tp_weaklistoffset */
0, /* tp_iter */ 0, /* tp_iter */
0, /* tp_iternext */ 0, /* tp_iternext */
0, /* tp_methods */ Array_methods, /* tp_methods */
0, /* tp_members */ 0, /* tp_members */
0, /* tp_getset */ 0, /* tp_getset */
0, /* tp_base */ 0, /* tp_base */

View File

@ -302,6 +302,8 @@ static PyMethodDef simplequeue_methods[] = {
_QUEUE_SIMPLEQUEUE_PUT_METHODDEF _QUEUE_SIMPLEQUEUE_PUT_METHODDEF
_QUEUE_SIMPLEQUEUE_PUT_NOWAIT_METHODDEF _QUEUE_SIMPLEQUEUE_PUT_NOWAIT_METHODDEF
_QUEUE_SIMPLEQUEUE_QSIZE_METHODDEF _QUEUE_SIMPLEQUEUE_QSIZE_METHODDEF
{"__class_getitem__", (PyCFunction)Py_GenericAlias,
METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };