Skip to content

Commit 4d10f70

Browse files
gh-92114: Improve error message for types with __class_getitem__ = None (GH-92115)
1 parent ed71129 commit 4d10f70

File tree

3 files changed

+12
-1
lines changed

3 files changed

+12
-1
lines changed

Lib/test/test_genericclass.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ def __class_getitem__(cls):
220220
return None
221221
with self.assertRaises(TypeError):
222222
C_too_few[int]
223+
223224
class C_too_many:
224225
def __class_getitem__(cls, one, two):
225226
return None
@@ -232,16 +233,23 @@ def __class_getitem__(cls, item):
232233
return None
233234
with self.assertRaises(TypeError):
234235
C()[int]
236+
235237
class E: ...
236238
e = E()
237239
e.__class_getitem__ = lambda cls, item: 'This will not work'
238240
with self.assertRaises(TypeError):
239241
e[int]
242+
240243
class C_not_callable:
241244
__class_getitem__ = "Surprise!"
242245
with self.assertRaises(TypeError):
243246
C_not_callable[int]
244247

248+
class C_is_none(tuple):
249+
__class_getitem__ = None
250+
with self.assertRaisesRegex(TypeError, "C_is_none"):
251+
C_is_none[int]
252+
245253
def test_class_getitem_metaclass(self):
246254
class Meta(type):
247255
def __class_getitem__(cls, item):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Improve error message when subscript a type with ``__class_getitem__`` set
2+
to ``None``.

Objects/abstract.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,12 @@ PyObject_GetItem(PyObject *o, PyObject *key)
185185
if (_PyObject_LookupAttr(o, &_Py_ID(__class_getitem__), &meth) < 0) {
186186
return NULL;
187187
}
188-
if (meth) {
188+
if (meth && meth != Py_None) {
189189
result = PyObject_CallOneArg(meth, key);
190190
Py_DECREF(meth);
191191
return result;
192192
}
193+
Py_XDECREF(meth);
193194
PyErr_Format(PyExc_TypeError, "type '%.200s' is not subscriptable",
194195
((PyTypeObject *)o)->tp_name);
195196
return NULL;

0 commit comments

Comments
 (0)