]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38979: fix ContextVar "__class_getitem__" method (GH-17497)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 8 Dec 2019 11:53:07 +0000 (03:53 -0800)
committerGitHub <noreply@github.com>
Sun, 8 Dec 2019 11:53:07 +0000 (03:53 -0800)
now contextvars.ContextVar "__class_getitem__" method returns ContextVar class, not None.

https://bugs.python.org/issue38979

Automerge-Triggered-By: @asvetlov
(cherry picked from commit 28c91631c24e53713ad0e8a2bbae716373f5e53d)

Co-authored-by: AMIR <31338382+amiremohamadi@users.noreply.github.com>
Lib/test/test_context.py
Misc/NEWS.d/next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst [new file with mode: 0644]
Python/context.c

index efd7319a23ae0268b2d037aa76174adc343474bc..b9e991a400092915695ef23e971bf0a5c187f4f6 100644 (file)
@@ -38,9 +38,6 @@ class ContextTest(unittest.TestCase):
 
         self.assertNotEqual(hash(c), hash('aaa'))
 
-    def test_context_var_new_2(self):
-        self.assertIsNone(contextvars.ContextVar[int])
-
     @isolated_context
     def test_context_var_repr_1(self):
         c = contextvars.ContextVar('a')
@@ -361,6 +358,10 @@ 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
 
diff --git a/Misc/NEWS.d/next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst b/Misc/NEWS.d/next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst
new file mode 100644 (file)
index 0000000..6a91a12
--- /dev/null
@@ -0,0 +1 @@
+Return class from ``ContextVar.__class_getitem__`` to simplify subclassing.
index 90c71e386d53a17e31519e34e7c9d1e78580e749..c1575c9e20e80fa4eb613941de361912a772d4cf 100644 (file)
@@ -974,9 +974,10 @@ _contextvars_ContextVar_reset(PyContextVar *self, PyObject *token)
 
 
 static PyObject *
-contextvar_cls_getitem(PyObject *self, PyObject *args)
+contextvar_cls_getitem(PyObject *self, PyObject *arg)
 {
-    Py_RETURN_NONE;
+    Py_INCREF(self);
+    return self;
 }
 
 static PyMemberDef PyContextVar_members[] = {
@@ -989,7 +990,7 @@ static PyMethodDef PyContextVar_methods[] = {
     _CONTEXTVARS_CONTEXTVAR_SET_METHODDEF
     _CONTEXTVARS_CONTEXTVAR_RESET_METHODDEF
     {"__class_getitem__", contextvar_cls_getitem,
-        METH_VARARGS | METH_STATIC, NULL},
+        METH_O | METH_CLASS, NULL},
     {NULL, NULL}
 };