[Python-checkins] bpo-34838: Use subclass_of for math.dist. (GH-9659)

Serhiy Storchaka webhook-mailer at python.org
Sat Jan 12 01:23:45 EST 2019


https://github.com/python/cpython/commit/cb08a71c5c534f33d9486677534dafb087c30e8c
commit: cb08a71c5c534f33d9486677534dafb087c30e8c
branch: master
author: Ammar Askar <ammar_askar at hotmail.com>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2019-01-12T08:23:41+02:00
summary:

bpo-34838: Use subclass_of for math.dist. (GH-9659)

Argument clinic now generates fast inline code for
positional parsing, so the manually implemented type
check in math.dist can be removed.

files:
M Lib/test/test_math.py
M Modules/clinic/mathmodule.c.h
M Modules/mathmodule.c

diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py
index 9b2f55e1f410..b476a39e0aeb 100644
--- a/Lib/test/test_math.py
+++ b/Lib/test/test_math.py
@@ -867,6 +867,8 @@ class T(tuple):
             dist((1, 2, 3, 4), (5, 6, 7))
         with self.assertRaises(ValueError):        # Check dimension agree
             dist((1, 2, 3), (4, 5, 6, 7))
+        with self.assertRaises(TypeError):         # Rejects invalid types
+            dist("abc", "xyz")
 
         # Verify that the one dimensional case is equivalent to abs()
         for i in range(20):
diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h
index 1c8fc2fc2c3f..82a4c4a0e7a4 100644
--- a/Modules/clinic/mathmodule.c.h
+++ b/Modules/clinic/mathmodule.c.h
@@ -310,7 +310,15 @@ math_dist(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     if (!_PyArg_CheckPositional("dist", nargs, 2, 2)) {
         goto exit;
     }
+    if (!PyTuple_Check(args[0])) {
+        _PyArg_BadArgument("dist", 1, "tuple", args[0]);
+        goto exit;
+    }
     p = args[0];
+    if (!PyTuple_Check(args[1])) {
+        _PyArg_BadArgument("dist", 2, "tuple", args[1]);
+        goto exit;
+    }
     q = args[1];
     return_value = math_dist_impl(module, p, q);
 
@@ -548,4 +556,4 @@ math_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=f3264ab0ef57ba0a input=a9049054013a1b77]*/
+/*[clinic end generated code: output=0664f30046da09fe input=a9049054013a1b77]*/
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index d56c91cedc26..2db2b45dd204 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -2101,8 +2101,8 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan)
 /*[clinic input]
 math.dist
 
-    p: object
-    q: object
+    p: object(subclass_of='&PyTuple_Type')
+    q: object(subclass_of='&PyTuple_Type')
     /
 
 Return the Euclidean distance between two points p and q.
@@ -2116,7 +2116,7 @@ Roughly equivalent to:
 
 static PyObject *
 math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
-/*[clinic end generated code: output=56bd9538d06bbcfe input=8c83c07c7a524664]*/
+/*[clinic end generated code: output=56bd9538d06bbcfe input=937122eaa5f19272]*/
 {
     PyObject *item;
     double max = 0.0;
@@ -2126,11 +2126,6 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
     double diffs_on_stack[NUM_STACK_ELEMS];
     double *diffs = diffs_on_stack;
 
-    if (!PyTuple_Check(p) || !PyTuple_Check(q)) {
-        PyErr_SetString(PyExc_TypeError, "dist argument must be a tuple");
-        return NULL;
-    }
-
     m = PyTuple_GET_SIZE(p);
     n = PyTuple_GET_SIZE(q);
     if (m != n) {



More information about the Python-checkins mailing list