gh-91578: improved error message when trying to instantiate an abstract class with missing methods (gh-47246)

This commit is contained in:
ravi140222 2022-05-12 20:56:11 +05:30 committed by GitHub
parent 8a0d9a6bb7
commit 079f0dd719
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 9 additions and 8 deletions

View file

@ -154,7 +154,7 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
@abc.abstractmethod @abc.abstractmethod
def method_one(self): def method_one(self):
pass pass
msg = r"class C with abstract method method_one" msg = r"class C without an implementation for abstract method method_one"
self.assertRaisesRegex(TypeError, msg, C) self.assertRaisesRegex(TypeError, msg, C)
def test_object_new_with_many_abstractmethods(self): def test_object_new_with_many_abstractmethods(self):
@ -165,7 +165,7 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
@abc.abstractmethod @abc.abstractmethod
def method_two(self): def method_two(self):
pass pass
msg = r"class C with abstract methods method_one, method_two" msg = r"class C without an implementation for abstract methods method_one, method_two"
self.assertRaisesRegex(TypeError, msg, C) self.assertRaisesRegex(TypeError, msg, C)
def test_abstractmethod_integration(self): def test_abstractmethod_integration(self):
@ -535,7 +535,7 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
A.foo = updated_foo A.foo = updated_foo
abc.update_abstractmethods(A) abc.update_abstractmethods(A)
self.assertEqual(A.__abstractmethods__, {'foo', 'bar'}) self.assertEqual(A.__abstractmethods__, {'foo', 'bar'})
msg = "class A with abstract methods bar, foo" msg = "class A without an implementation for abstract methods bar, foo"
self.assertRaisesRegex(TypeError, msg, A) self.assertRaisesRegex(TypeError, msg, A)
def test_update_implementation(self): def test_update_implementation(self):
@ -547,7 +547,7 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
class B(A): class B(A):
pass pass
msg = "class B with abstract method foo" msg = "class B without an implementation for abstract method foo"
self.assertRaisesRegex(TypeError, msg, B) self.assertRaisesRegex(TypeError, msg, B)
self.assertEqual(B.__abstractmethods__, {'foo'}) self.assertEqual(B.__abstractmethods__, {'foo'})
@ -605,7 +605,7 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
abc.update_abstractmethods(B) abc.update_abstractmethods(B)
msg = "class B with abstract method foo" msg = "class B without an implementation for abstract method foo"
self.assertRaisesRegex(TypeError, msg, B) self.assertRaisesRegex(TypeError, msg, B)
def test_update_layered_implementation(self): def test_update_layered_implementation(self):
@ -627,7 +627,7 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
abc.update_abstractmethods(C) abc.update_abstractmethods(C)
msg = "class C with abstract method foo" msg = "class C without an implementation for abstract method foo"
self.assertRaisesRegex(TypeError, msg, C) self.assertRaisesRegex(TypeError, msg, C)
def test_update_multi_inheritance(self): def test_update_multi_inheritance(self):

View file

@ -3762,7 +3762,7 @@ class TestAbstract(unittest.TestCase):
day: 'int' day: 'int'
self.assertTrue(inspect.isabstract(Date)) self.assertTrue(inspect.isabstract(Date))
msg = 'class Date with abstract method foo' msg = 'class Date without an implementation for abstract method foo'
self.assertRaisesRegex(TypeError, msg, Date) self.assertRaisesRegex(TypeError, msg, Date)

View file

@ -0,0 +1 @@
Updates the error message for abstract class.

View file

@ -4559,7 +4559,7 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"Can't instantiate abstract class %s " "Can't instantiate abstract class %s "
"with abstract method%s %U", "without an implementation for abstract method%s %U",
type->tp_name, type->tp_name,
method_count > 1 ? "s" : "", method_count > 1 ? "s" : "",
joined); joined);