mirror of https://github.com/python/cpython
bpo-34331: Fix incorrectly pluralized abstract class error message. (GH-8670)
This commit is contained in:
parent
19f6940cd7
commit
4a12a178f4
|
@ -149,6 +149,25 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
|
|||
self.assertEqual(D.foo(), 4)
|
||||
self.assertEqual(D().foo(), 4)
|
||||
|
||||
def test_object_new_with_one_abstractmethod(self):
|
||||
class C(metaclass=abc_ABCMeta):
|
||||
@abc.abstractmethod
|
||||
def method_one(self):
|
||||
pass
|
||||
msg = r"class C with abstract method method_one"
|
||||
self.assertRaisesRegex(TypeError, msg, C)
|
||||
|
||||
def test_object_new_with_many_abstractmethods(self):
|
||||
class C(metaclass=abc_ABCMeta):
|
||||
@abc.abstractmethod
|
||||
def method_one(self):
|
||||
pass
|
||||
@abc.abstractmethod
|
||||
def method_two(self):
|
||||
pass
|
||||
msg = r"class C with abstract methods method_one, method_two"
|
||||
self.assertRaisesRegex(TypeError, msg, C)
|
||||
|
||||
def test_abstractmethod_integration(self):
|
||||
for abstractthing in [abc.abstractmethod, abc.abstractproperty,
|
||||
abc.abstractclassmethod,
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Use singular/plural noun in error message when instantiating an abstract
|
||||
class with non-overriden abstract method(s).
|
|
@ -3753,6 +3753,7 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
PyObject *joined;
|
||||
PyObject *comma;
|
||||
_Py_static_string(comma_id, ", ");
|
||||
Py_ssize_t method_count;
|
||||
|
||||
/* Compute ", ".join(sorted(type.__abstractmethods__))
|
||||
into joined. */
|
||||
|
@ -3773,14 +3774,18 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return NULL;
|
||||
}
|
||||
joined = PyUnicode_Join(comma, sorted_methods);
|
||||
method_count = PyObject_Length(sorted_methods);
|
||||
Py_DECREF(sorted_methods);
|
||||
if (joined == NULL)
|
||||
return NULL;
|
||||
if (method_count == -1)
|
||||
return NULL;
|
||||
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"Can't instantiate abstract class %s "
|
||||
"with abstract methods %U",
|
||||
"with abstract method%s %U",
|
||||
type->tp_name,
|
||||
method_count > 1 ? "s" : "",
|
||||
joined);
|
||||
Py_DECREF(joined);
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue