]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39481: PEP 585 for dataclasses, mailbox, contextvars (GH-19425)
authorEthan Smith <ethan@ethanhs.me>
Tue, 14 Apr 2020 23:14:15 +0000 (16:14 -0700)
committerGitHub <noreply@github.com>
Tue, 14 Apr 2020 23:14:15 +0000 (16:14 -0700)
Lib/dataclasses.py
Lib/mailbox.py
Lib/test/test_context.py
Lib/test/test_genericalias.py
Python/context.c

index 00851c648a13b5b15c28deb5ac5479f9c12c9996..fc69508354bbe86dcd8362f88f81495cef3ac330 100644 (file)
@@ -7,6 +7,7 @@ import keyword
 import builtins
 import functools
 import _thread
+from types import GenericAlias
 
 
 __all__ = ['dataclass',
@@ -284,6 +285,8 @@ class Field:
             # it.
             func(self.default, owner, name)
 
+    __class_getitem__ = classmethod(GenericAlias)
+
 
 class _DataclassParams:
     __slots__ = ('init',
index 5b4e86419f1173147ab4957af415ebcaef655b20..70da07ed2e9e8bc18dfc26ac1762f4102bcf4426 100644 (file)
@@ -18,6 +18,7 @@ import email.message
 import email.generator
 import io
 import contextlib
+from types import GenericAlias
 try:
     import fcntl
 except ImportError:
@@ -260,6 +261,8 @@ class Mailbox:
         else:
             raise TypeError('Invalid message type: %s' % type(message))
 
+    __class_getitem__ = classmethod(GenericAlias)
+
 
 class Maildir(Mailbox):
     """A qmail-style Maildir mailbox."""
@@ -2015,6 +2018,8 @@ class _ProxyFile:
             return False
         return self._file.closed
 
+    __class_getitem__ = classmethod(GenericAlias)
+
 
 class _PartialFile(_ProxyFile):
     """A read-only wrapper of part of a file."""
index b9e991a400092915695ef23e971bf0a5c187f4f6..2d8b63a1f59581e1c471ca82dc8c13fb8fda3e71 100644 (file)
@@ -358,10 +358,6 @@ class ContextTest(unittest.TestCase):
             tp.shutdown()
         self.assertEqual(results, list(range(10)))
 
-    def test_contextvar_getitem(self):
-        clss = contextvars.ContextVar
-        self.assertEqual(clss[str], clss)
-
 
 # HAMT Tests
 
index 686df17d6a961f1ccf9e89ebd80ff2b2ddba42db..37cbf92ed11610b9fa70480af6c3699d1800db07 100644 (file)
@@ -9,7 +9,10 @@ from collections.abc import *
 from concurrent.futures import Future
 from concurrent.futures.thread import _WorkItem
 from contextlib import AbstractContextManager, AbstractAsyncContextManager
-from functools import partial, partialmethod, _lru_cache_wrapper, cached_property
+from contextvars import ContextVar, Token
+from dataclasses import Field
+from functools import partial, partialmethod, cached_property
+from mailbox import Mailbox, _PartialFile
 from ctypes import Array, LibraryLoader
 from difflib import SequenceMatcher
 from filecmp import dircmp
@@ -60,6 +63,9 @@ class BaseTest(unittest.TestCase):
                   Reversible,
                   Container, Collection,
                   Callable,
+                  Mailbox, _PartialFile,
+                  ContextVar, Token,
+                  Field,
                   Set, MutableSet,
                   Mapping, MutableMapping, MappingView,
                   KeysView, ItemsView, ValuesView,
index 00f25ddab41d1c72fa8362bdced9e1c03856b43a..15749e9fd7741931b50d1fbaa642369c6fd4dc7c 100644 (file)
@@ -1024,13 +1024,6 @@ _contextvars_ContextVar_reset(PyContextVar *self, PyObject *token)
 }
 
 
-static PyObject *
-contextvar_cls_getitem(PyObject *self, PyObject *arg)
-{
-    Py_INCREF(self);
-    return self;
-}
-
 static PyMemberDef PyContextVar_members[] = {
     {"name", T_OBJECT, offsetof(PyContextVar, var_name), READONLY},
     {NULL}
@@ -1040,8 +1033,8 @@ static PyMethodDef PyContextVar_methods[] = {
     _CONTEXTVARS_CONTEXTVAR_GET_METHODDEF
     _CONTEXTVARS_CONTEXTVAR_SET_METHODDEF
     _CONTEXTVARS_CONTEXTVAR_RESET_METHODDEF
-    {"__class_getitem__", contextvar_cls_getitem,
-        METH_O | METH_CLASS, NULL},
+    {"__class_getitem__", (PyCFunction)Py_GenericAlias,
+    METH_O|METH_CLASS,       PyDoc_STR("See PEP 585")},
     {NULL, NULL}
 };
 
@@ -1180,10 +1173,17 @@ static PyGetSetDef PyContextTokenType_getsetlist[] = {
     {NULL}
 };
 
+static PyMethodDef PyContextTokenType_methods[] = {
+    {"__class_getitem__",    (PyCFunction)Py_GenericAlias,
+    METH_O|METH_CLASS,       PyDoc_STR("See PEP 585")},
+    {NULL}
+};
+
 PyTypeObject PyContextToken_Type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "Token",
     sizeof(PyContextToken),
+    .tp_methods = PyContextTokenType_methods,
     .tp_getset = PyContextTokenType_getsetlist,
     .tp_dealloc = (destructor)token_tp_dealloc,
     .tp_getattro = PyObject_GenericGetAttr,