mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
gh-92114: Improve error message for types with __class_getitem__ = None (GH-92115)
This commit is contained in:
parent
ed711290a0
commit
4d10f703d7
3 changed files with 12 additions and 1 deletions
|
@ -220,6 +220,7 @@ class TestClassGetitem(unittest.TestCase):
|
||||||
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 @@ class TestClassGetitem(unittest.TestCase):
|
||||||
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):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Improve error message when subscript a type with ``__class_getitem__`` set
|
||||||
|
to ``None``.
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue