From 0b5485acf853aa3f5c816a33652d872d7ca7e108 Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Wed, 29 Jan 2020 21:55:53 -0800 Subject: [PATCH 1/4] Make isinstance and issubclass error for GenericAlias --- Lib/test/test_genericalias.py | 11 +++++++++++ Objects/descrobject.c | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 3289e0bf90d75a..f315eb660610d2 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -95,6 +95,17 @@ def test_exposed_type(self): self.assertIs(a.__origin__, list) self.assertEqual(a.__parameters__, (int,)) + def test_isinstance(self): + self.assertTrue(isinstance([], list)) + with self.assertRaises(TypeError): + isinstance([], list[str]) + + def test_issubclass(self): + class T(list): ... + self.assertTrue(issubclass(T, list)) + with self.assertRaises(TypeError): + issubclass(T, list[str]) + if __name__ == "__main__": unittest.main() diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 901cf2a91b3d55..b8fc218e3f93ab 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1946,8 +1946,26 @@ ga_mro_entries(PyObject *self, PyObject *args) return PyTuple_Pack(1, alias->origin); } +static PyObject * +ga_instancecheck(PyObject *self, PyObject *instance) { + return PyErr_Format(PyExc_TypeError, + "TypeError: Subscripted generics cannot be used with" + " class and instance checks", + self); +} + +static PyObject * +ga_subclasscheck(PyObject *self, PyObject *instance) { + return PyErr_Format(PyExc_TypeError, + "TypeError: Subscripted generics cannot be used with" + " class and instance checks", + self); +} + static PyMethodDef ga_methods[] = { {"__mro_entries__", ga_mro_entries, METH_O}, + {"__instancecheck__", ga_instancecheck, METH_O}, + {"__subclasscheck__", ga_subclasscheck, METH_O}, {0} }; From 69a48fb8e6be82757e705080318d57f15c27967e Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Wed, 29 Jan 2020 22:46:57 -0800 Subject: [PATCH 2/4] Use Py_UNUSED on ignored arg --- Objects/descrobject.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/descrobject.c b/Objects/descrobject.c index b8fc218e3f93ab..c6c23c14cbde4e 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1947,7 +1947,7 @@ ga_mro_entries(PyObject *self, PyObject *args) } static PyObject * -ga_instancecheck(PyObject *self, PyObject *instance) { +ga_instancecheck(PyObject *self, PyObject *Py_UNUSED(ignored)) { return PyErr_Format(PyExc_TypeError, "TypeError: Subscripted generics cannot be used with" " class and instance checks", @@ -1955,7 +1955,7 @@ ga_instancecheck(PyObject *self, PyObject *instance) { } static PyObject * -ga_subclasscheck(PyObject *self, PyObject *instance) { +ga_subclasscheck(PyObject *self, PyObject *Py_UNUSED(ignored)) { return PyErr_Format(PyExc_TypeError, "TypeError: Subscripted generics cannot be used with" " class and instance checks", From 0f5ea2f11c9bc195c8dff0a536beb0b398296461 Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Wed, 29 Jan 2020 23:01:58 -0800 Subject: [PATCH 3/4] PEP 7 --- Objects/descrobject.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Objects/descrobject.c b/Objects/descrobject.c index c6c23c14cbde4e..f9d1375fd5d25e 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1947,7 +1947,8 @@ ga_mro_entries(PyObject *self, PyObject *args) } static PyObject * -ga_instancecheck(PyObject *self, PyObject *Py_UNUSED(ignored)) { +ga_instancecheck(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ return PyErr_Format(PyExc_TypeError, "TypeError: Subscripted generics cannot be used with" " class and instance checks", @@ -1955,7 +1956,8 @@ ga_instancecheck(PyObject *self, PyObject *Py_UNUSED(ignored)) { } static PyObject * -ga_subclasscheck(PyObject *self, PyObject *Py_UNUSED(ignored)) { +ga_subclasscheck(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ return PyErr_Format(PyExc_TypeError, "TypeError: Subscripted generics cannot be used with" " class and instance checks", From dbccae8be56b6ac4cabff21be9d5433d246e708a Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Thu, 30 Jan 2020 18:05:55 -0800 Subject: [PATCH 4/4] Respond to review --- Lib/test/test_genericalias.py | 6 +++--- Objects/descrobject.c | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index f315eb660610d2..b2a89b3b477ee5 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -101,10 +101,10 @@ def test_isinstance(self): isinstance([], list[str]) def test_issubclass(self): - class T(list): ... - self.assertTrue(issubclass(T, list)) + class L(list): ... + self.assertTrue(issubclass(L, list)) with self.assertRaises(TypeError): - issubclass(T, list[str]) + issubclass(L, list[str]) if __name__ == "__main__": diff --git a/Objects/descrobject.c b/Objects/descrobject.c index f9d1375fd5d25e..da5dbf59823c85 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1950,8 +1950,7 @@ static PyObject * ga_instancecheck(PyObject *self, PyObject *Py_UNUSED(ignored)) { return PyErr_Format(PyExc_TypeError, - "TypeError: Subscripted generics cannot be used with" - " class and instance checks", + "TypeError: Subscripted generics cannot be used with class and instance checks", self); } @@ -1959,8 +1958,7 @@ static PyObject * ga_subclasscheck(PyObject *self, PyObject *Py_UNUSED(ignored)) { return PyErr_Format(PyExc_TypeError, - "TypeError: Subscripted generics cannot be used with" - " class and instance checks", + "TypeError: Subscripted generics cannot be used with class and instance checks", self); }