summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Andrade <dangro@users.noreply.github.com>2019-09-11 08:29:44 -0700
committerStéphane Wirtel <stephane@wirtel.be>2019-09-11 17:29:44 +0200
commit4a12a178f4a6b9a59d97fecc727f2b6b28dfc85f (patch)
treeb6ade2edb070705da46e18b2cbe299f3107f983d
parent19f6940cd7fb91246b88e1fbdbce97a02e7f3fa1 (diff)
downloadcpython-git-4a12a178f4a6b9a59d97fecc727f2b6b28dfc85f.tar.gz
bpo-34331: Fix incorrectly pluralized abstract class error message. (GH-8670)
-rw-r--r--Lib/test/test_abc.py19
-rw-r--r--Misc/NEWS.d/next/C API/2018-08-04-00-59-44.bpo-34331.iaUkmU.rst2
-rw-r--r--Objects/typeobject.c7
3 files changed, 27 insertions, 1 deletions
diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py
index 9f5afb241a..000e5838e3 100644
--- a/Lib/test/test_abc.py
+++ b/Lib/test/test_abc.py
@@ -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,
diff --git a/Misc/NEWS.d/next/C API/2018-08-04-00-59-44.bpo-34331.iaUkmU.rst b/Misc/NEWS.d/next/C API/2018-08-04-00-59-44.bpo-34331.iaUkmU.rst
new file mode 100644
index 0000000000..e45e0915db
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2018-08-04-00-59-44.bpo-34331.iaUkmU.rst
@@ -0,0 +1,2 @@
+Use singular/plural noun in error message when instantiating an abstract
+class with non-overriden abstract method(s).
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 7575e5580b..dfdac9e2e4 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -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;