From 177a13e077baf27d84f7858c99dd7c680424b11c Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Tue, 7 Apr 2020 16:32:14 -0700 Subject: [PATCH 1/3] Make dataclasses.Field, contextvars.Token, ... ... mailbox.MailBox, and mailbox._ProxyFile generic. --- Lib/dataclasses.py | 3 +++ Lib/mailbox.py | 5 +++++ Lib/test/test_genericalias.py | 6 ++++++ Python/context.c | 7 +++++++ 4 files changed, 21 insertions(+) diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 00851c648a13b5..fc69508354bbe8 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -7,6 +7,7 @@ import builtins import functools import _thread +from types import GenericAlias __all__ = ['dataclass', @@ -284,6 +285,8 @@ def __set_name__(self, owner, name): # it. func(self.default, owner, name) + __class_getitem__ = classmethod(GenericAlias) + class _DataclassParams: __slots__ = ('init', diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 5b4e86419f1173..70da07ed2e9e8b 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -18,6 +18,7 @@ import email.generator import io import contextlib +from types import GenericAlias try: import fcntl except ImportError: @@ -260,6 +261,8 @@ def _dump_message(self, message, target, mangle_from_=False): 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 @@ def closed(self): return False return self._file.closed + __class_getitem__ = classmethod(GenericAlias) + class _PartialFile(_ProxyFile): """A read-only wrapper of part of a file.""" diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 9c5b23e5e5b0fc..f494c16fdbe70a 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -7,6 +7,9 @@ ) from collections.abc import * from contextlib import AbstractContextManager, AbstractAsyncContextManager +from contextvars import Token +from dataclasses import Field +from mailbox import Mailbox, _PartialFile from os import DirEntry from re import Pattern, Match from types import GenericAlias, MappingProxyType @@ -31,6 +34,9 @@ def test_subscriptable(self): Reversible, Container, Collection, Callable, + Mailbox, _PartialFile, + Token, + Field, Set, MutableSet, Mapping, MutableMapping, MappingView, KeysView, ItemsView, ValuesView, diff --git a/Python/context.c b/Python/context.c index e0338c97e1873a..6da9ed66d6427b 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1179,10 +1179,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, From 7915b3840ecc5c4a9af8b1d16a21f57d0f8636d6 Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Sun, 12 Apr 2020 23:37:44 -0700 Subject: [PATCH 2/3] Make ContextVar generic --- Lib/test/test_genericalias.py | 4 ++-- Python/context.c | 11 ++--------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 40130a03bc5906..21d1e165da4c6f 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -9,7 +9,7 @@ from concurrent.futures import Future from concurrent.futures.thread import _WorkItem from contextlib import AbstractContextManager, AbstractAsyncContextManager -from contextvars import Token +from contextvars import ContextVar, Token from dataclasses import Field from mailbox import Mailbox, _PartialFile from ctypes import Array, LibraryLoader @@ -57,7 +57,7 @@ def test_subscriptable(self): Container, Collection, Callable, Mailbox, _PartialFile, - Token, + ContextVar, Token, Field, Set, MutableSet, Mapping, MutableMapping, MappingView, diff --git a/Python/context.c b/Python/context.c index 6da9ed66d6427b..bca2adab724377 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1023,13 +1023,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} @@ -1039,8 +1032,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} }; From 476f722166e365adbf485fb41ef9e59db3ae3877 Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Mon, 13 Apr 2020 05:19:05 -0700 Subject: [PATCH 3/3] Remove redundant test --- Lib/test/test_context.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index b9e991a4000929..2d8b63a1f59581 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -358,10 +358,6 @@ def sub(num): tp.shutdown() self.assertEqual(results, list(range(10))) - def test_contextvar_getitem(self): - clss = contextvars.ContextVar - self.assertEqual(clss[str], clss) - # HAMT Tests