Skip to content

Commit

Permalink
pythongh-92114: Improve error message for types with __class_getitem_…
Browse files Browse the repository at this point in the history
…_ = None
  • Loading branch information
serhiy-storchaka committed May 1, 2022
1 parent ad5e852 commit 1dabc3a
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 1 deletion.
8 changes: 8 additions & 0 deletions Lib/test/test_genericclass.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ def __class_getitem__(cls):
return None
with self.assertRaises(TypeError):
C_too_few[int]

class C_too_many:
def __class_getitem__(cls, one, two):
return None
Expand All @@ -232,16 +233,23 @@ def __class_getitem__(cls, item):
return None
with self.assertRaises(TypeError):
C()[int]

class E: ...
e = E()
e.__class_getitem__ = lambda cls, item: 'This will not work'
with self.assertRaises(TypeError):
e[int]

class C_not_callable:
__class_getitem__ = "Surprise!"
with self.assertRaises(TypeError):
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):
class Meta(type):
def __class_getitem__(cls, item):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Improve error message when subscript a type with ``__class_getitem__`` set
to ``None``.
3 changes: 2 additions & 1 deletion Objects/abstract.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,11 +185,12 @@ PyObject_GetItem(PyObject *o, PyObject *key)
if (_PyObject_LookupAttr(o, &_Py_ID(__class_getitem__), &meth) < 0) {
return NULL;
}
if (meth) {
if (meth && meth != Py_None) {
result = PyObject_CallOneArg(meth, key);
Py_DECREF(meth);
return result;
}
Py_XDECREF(meth);
PyErr_Format(PyExc_TypeError, "type '%.200s' is not subscriptable",
((PyTypeObject *)o)->tp_name);
return NULL;
Expand Down

0 comments on commit 1dabc3a

Please sign in to comment.