summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2022-08-10 18:25:39 (GMT)
committerGitHub <noreply@github.com>2022-08-10 18:25:39 (GMT)
commit97e9cfa75a80b54a0630b7371f35e368a12749d1 (patch)
tree75e148bc8a55cd77ddc9cf81175079c3bf52d186
parent37c0f9ccc06750a7e22f5c176df39373f7aca526 (diff)
downloadcpython-97e9cfa75a80b54a0630b7371f35e368a12749d1.zip
cpython-97e9cfa75a80b54a0630b7371f35e368a12749d1.tar.gz
cpython-97e9cfa75a80b54a0630b7371f35e368a12749d1.tar.bz2
gh-95605: Fix `float(s)` error message when `s` contains only whitespace (GH-95665)
This PR fixes the error message from float(s) in the case where s contains only whitespace.
-rw-r--r--Lib/test/test_float.py4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-08-04-18-46-54.gh-issue-95605.FbpCoG.rst2
-rw-r--r--Objects/floatobject.c9
3 files changed, 14 insertions, 1 deletions
diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
index b5e271a..f8350c1 100644
--- a/Lib/test/test_float.py
+++ b/Lib/test/test_float.py
@@ -137,6 +137,10 @@ class GeneralFloatCases(unittest.TestCase):
check('123\xbd')
check(' 123 456 ')
check(b' 123 456 ')
+ # all whitespace (cf. https://github.com/python/cpython/issues/95605)
+ check('')
+ check(' ')
+ check('\t \n')
# non-ascii digits (error came from non-digit '!')
check('\u0663\u0661\u0664!')
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-08-04-18-46-54.gh-issue-95605.FbpCoG.rst b/Misc/NEWS.d/next/Core and Builtins/2022-08-04-18-46-54.gh-issue-95605.FbpCoG.rst
new file mode 100644
index 0000000..49441c6
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-08-04-18-46-54.gh-issue-95605.FbpCoG.rst
@@ -0,0 +1,2 @@
+Fix misleading contents of error message when converting an all-whitespace
+string to :class:`float`.
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 4b1b24f..c435357 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -162,11 +162,18 @@ float_from_string_inner(const char *s, Py_ssize_t len, void *obj)
double x;
const char *end;
const char *last = s + len;
- /* strip space */
+ /* strip leading whitespace */
while (s < last && Py_ISSPACE(*s)) {
s++;
}
+ if (s == last) {
+ PyErr_Format(PyExc_ValueError,
+ "could not convert string to float: "
+ "%R", obj);
+ return NULL;
+ }
+ /* strip trailing whitespace */
while (s < last - 1 && Py_ISSPACE(last[-1])) {
last--;
}