From 97e9cfa75a80b54a0630b7371f35e368a12749d1 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Wed, 10 Aug 2022 19:25:39 +0100 Subject: [PATCH] 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. --- Lib/test/test_float.py | 4 ++++ .../2022-08-04-18-46-54.gh-issue-95605.FbpCoG.rst | 2 ++ Objects/floatobject.c | 9 ++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-08-04-18-46-54.gh-issue-95605.FbpCoG.rst diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index b5e271abc86..f8350c1e4ca 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -137,6 +137,10 @@ def check(s): 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 00000000000..49441c6b311 --- /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 4b1b24f2e70..c4353572d32 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--; }