Skip to content
Snippets Groups Projects
Unverified Commit 4d10f703 authored by Serhiy Storchaka's avatar Serhiy Storchaka Committed by GitHub
Browse files

gh-92114: Improve error message for types with __class_getitem__ = None (GH-92115)

parent ed711290
No related branches found
No related tags found
No related merge requests found
...@@ -220,6 +220,7 @@ def __class_getitem__(cls): ...@@ -220,6 +220,7 @@ def __class_getitem__(cls):
return None return None
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
C_too_few[int] C_too_few[int]
class C_too_many: class C_too_many:
def __class_getitem__(cls, one, two): def __class_getitem__(cls, one, two):
return None return None
...@@ -232,16 +233,23 @@ def __class_getitem__(cls, item): ...@@ -232,16 +233,23 @@ def __class_getitem__(cls, item):
return None return None
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
C()[int] C()[int]
class E: ... class E: ...
e = E() e = E()
e.__class_getitem__ = lambda cls, item: 'This will not work' e.__class_getitem__ = lambda cls, item: 'This will not work'
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
e[int] e[int]
class C_not_callable: class C_not_callable:
__class_getitem__ = "Surprise!" __class_getitem__ = "Surprise!"
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
C_not_callable[int] C_not_callable[int]
class C_is_none(tuple):
__class_getitem__ = None
with self.assertRaisesRegex(TypeError, "C_is_none"):
C_is_none[int]
def test_class_getitem_metaclass(self): def test_class_getitem_metaclass(self):
class Meta(type): class Meta(type):
def __class_getitem__(cls, item): def __class_getitem__(cls, item):
......
Improve error message when subscript a type with ``__class_getitem__`` set
to ``None``.
...@@ -185,11 +185,12 @@ PyObject_GetItem(PyObject *o, PyObject *key) ...@@ -185,11 +185,12 @@ PyObject_GetItem(PyObject *o, PyObject *key)
if (_PyObject_LookupAttr(o, &_Py_ID(__class_getitem__), &meth) < 0) { if (_PyObject_LookupAttr(o, &_Py_ID(__class_getitem__), &meth) < 0) {
return NULL; return NULL;
} }
if (meth) { if (meth && meth != Py_None) {
result = PyObject_CallOneArg(meth, key); result = PyObject_CallOneArg(meth, key);
Py_DECREF(meth); Py_DECREF(meth);
return result; return result;
} }
Py_XDECREF(meth);
PyErr_Format(PyExc_TypeError, "type '%.200s' is not subscriptable", PyErr_Format(PyExc_TypeError, "type '%.200s' is not subscriptable",
((PyTypeObject *)o)->tp_name); ((PyTypeObject *)o)->tp_name);
return NULL; return NULL;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment